From 1c1eb8bc0ceb5c6a7fe96351396b336be8ed30ea Mon Sep 17 00:00:00 2001 From: XianYuFish001 Date: Wed, 24 Sep 2025 14:06:45 +0800 Subject: [PATCH] Initial --- README.md | 25 --- TEMPLATE_LICENSE.txt | 24 --- build.gradle | 19 +- gradle.properties | 36 +--- src/main/java/com/extendedae_plus/Config.java | 42 ----- .../com/extendedae_plus/ExtendedAEPlus.java | 13 +- .../client/ClientModelEvents.java | 2 +- .../extendedae_plus/client/ClientProxy.java | 10 +- .../extendedae_plus/client/InputEvents.java | 120 +++++------- .../client/ui/ProviderSelectScreen.java | 1 - .../{ModConfigs.java => ModConfig.java} | 48 ++--- .../content/ClientPatternHighlightStore.java | 2 - .../NetworkPatternControllerBlockEntity.java | 13 +- .../crafting/EPlusCraftingUnitType.java | 3 +- .../com/extendedae_plus/hooks/WrenchHook.java | 4 +- .../init/ModBlockEntities.java | 8 +- .../com/extendedae_plus/init/ModBlocks.java | 8 +- .../extendedae_plus/init/ModMenuTypes.java | 4 +- .../integration/jei/ExtendedAEJeiPlugin.java | 22 --- .../integration/jei/JeiRuntimeProxy.java | 177 ------------------ .../menu/NetworkPatternControllerMenu.java | 2 +- .../menu/host/CuriosWTSubMenuHost.java | 2 +- .../menu/host/CuriosWTSubMenuHost2.java | 4 +- .../host/CuriosWirelessTerminalMenuHost.java | 4 +- .../mixin/PickFromWirelessMixin.java | 51 ++--- .../mixin/ae2/EncodedPatternItemMixin.java | 10 +- .../PatternEncodingTermMenuAccessor.java | 8 + .../autopattern/CraftingTreeProcessMixin.java | 4 +- .../ae2/client/gui/AEBaseScreenMixin.java | 1 - .../gui/PatternEncodingTermScreenMixin.java | 50 ++--- .../PatternProviderLogicAdvancedMixin.java | 1 - .../PatternProviderLogicDoublingMixin.java | 1 - ...ContainerPatternEncodingTermMenuMixin.java | 7 +- .../ae2/menu/CraftConfirmMenuGoBackMixin.java | 7 +- .../menu/PatternEncodingTermMenuMixin.java | 22 ++- .../PatternProviderMenuAdvancedMixin.java | 4 - .../PatternProviderMenuDoublingMixin.java | 2 - ...tainerUWirelessExPatternTerminalMixin.java | 22 --- .../mixin/emi/MixinEncodePatternTransfer.java | 30 +++ .../MixinEncodingHelper.java} | 23 ++- .../client/gui/GuiExPatternProviderMixin.java | 11 +- .../client/gui/GuiExPatternTerminalMixin.java | 25 +-- .../common/PartExPatternProviderMixin.java | 4 +- .../common/TileExPatternProviderMixin.java | 4 +- .../ContainerExPatternProviderMixin.java | 1 - .../mixin/hooks/ModelBakeryMixin.java | 10 +- ...2JeiEncodePatternTransferHandlerMixin.java | 49 ----- .../EncodePatternTransferHandlerMixin.java | 42 ----- .../jei/accessor/BookmarkOverlayAccessor.java | 12 -- .../network/C2SPacketEncodeFinished.java | 27 +++ .../network/CraftingMonitorJumpC2SPacket.java | 6 - .../CraftingMonitorOpenProviderC2SPacket.java | 5 +- .../GlobalToggleProviderModesC2SPacket.java | 6 +- .../InterfaceAdjustConfigAmountC2SPacket.java | 2 +- .../extendedae_plus/network/ModNetwork.java | 22 ++- .../network/OpenProviderUiC2SPacket.java | 8 +- .../network/SetPatternHighlightS2CPacket.java | 2 +- .../ToggleAdvancedBlockingC2SPacket.java | 8 +- .../network/ToggleSmartDoublingC2SPacket.java | 4 +- .../util/ExtendedAEPatternUploadUtil.java | 11 +- .../extendedae_plus/util/PatternScaler.java | 8 +- .../wireless/WirelessMasterRegistry.java | 4 +- .../wireless/WirelessSlaveLink.java | 6 +- .../assets/extendedae_plus/lang/en_us.json | 2 + .../assets/extendedae_plus/lang/zh_cn.json | 1 + .../resources/extendedae_plus.mixins.json | 13 +- 66 files changed, 353 insertions(+), 776 deletions(-) delete mode 100644 README.md delete mode 100644 TEMPLATE_LICENSE.txt delete mode 100644 src/main/java/com/extendedae_plus/Config.java rename src/main/java/com/extendedae_plus/config/{ModConfigs.java => ModConfig.java} (72%) delete mode 100644 src/main/java/com/extendedae_plus/integration/jei/ExtendedAEJeiPlugin.java delete mode 100644 src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java delete mode 100644 src/main/java/com/extendedae_plus/mixin/ae2WTlib/ContainerUWirelessExPatternTerminalMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/emi/MixinEncodePatternTransfer.java rename src/main/java/com/extendedae_plus/mixin/{jei/EncodingHelperMixin.java => emi/MixinEncodingHelper.java} (59%) delete mode 100644 src/main/java/com/extendedae_plus/mixin/jei/AE2JeiEncodePatternTransferHandlerMixin.java delete mode 100644 src/main/java/com/extendedae_plus/mixin/jei/EncodePatternTransferHandlerMixin.java delete mode 100644 src/main/java/com/extendedae_plus/mixin/jei/accessor/BookmarkOverlayAccessor.java create mode 100644 src/main/java/com/extendedae_plus/network/C2SPacketEncodeFinished.java diff --git a/README.md b/README.md deleted file mode 100644 index b421122..0000000 --- a/README.md +++ /dev/null @@ -1,25 +0,0 @@ - -Installation information -======= - -This template repository can be directly cloned to get you started with a new -mod. Simply create a new repository cloned from this one, by following the -instructions provided by [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template). - -Once you have your clone, simply open the repository in the IDE of your choice. The usual recommendation for an IDE is either IntelliJ IDEA or Eclipse. - -If at any point you are missing libraries in your IDE, or you've run into problems you can -run `gradlew --refresh-dependencies` to refresh the local cache. `gradlew clean` to reset everything -{this does not affect your code} and then start the process again. - -Mapping Names: -============ -By default, the MDK is configured to use the official mapping names from Mojang for methods and fields -in the Minecraft codebase. These names are covered by a specific license. All modders should be aware of this -license. For the latest license text, refer to the mapping file itself, or the reference copy here: -https://github.com/NeoForged/NeoForm/blob/main/Mojang.md - -Additional Resources: -========== -Community Documentation: https://docs.neoforged.net/ -NeoForged Discord: https://discord.neoforged.net/ diff --git a/TEMPLATE_LICENSE.txt b/TEMPLATE_LICENSE.txt deleted file mode 100644 index b64bc64..0000000 --- a/TEMPLATE_LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -MIT License - -Copyright (c) 2023 NeoForged project - -This license applies to the template files as supplied by github.com/NeoForged/MDK - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/build.gradle b/build.gradle index 9687e17..ace6636 100644 --- a/build.gradle +++ b/build.gradle @@ -144,7 +144,6 @@ dependencies { compileOnly "curse.maven:mega-cells-622112:6005043" compileOnly "curse.maven:jade-324717:5427817" compileOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" - // compileOnly "mekanism:Mekanism:1.21.1-10.7.0.55" compileOnly "curse.maven:applied-mekanistics-574300:5978711" compileOnly "dev.latvian.mods:kubejs-neoforge:2101.7.1-build.188" compileOnly "dev.latvian.mods:rhino:2101.2.5-build.54" @@ -159,24 +158,12 @@ dependencies { runtimeOnly "de.mari_023:ae2wtlib:19.2.1" runtimeOnly "curse.maven:jade-324717:5427817" runtimeOnly "curse.maven:mega-cells-622112:6005043" - // runtimeOnly "mekanism:Mekanism:1.21.1-10.7.0.55" runtimeOnly "curse.maven:ex-pattern-provider-892005:6863556" // setup Xei (EMI/REI/JEI) using project property 'use_Xei' - switch (project.findProperty('use_Xei') ?: 'emi') { - case 'emi': - runtimeOnly "dev.emi:emi-neoforge:1.1.10+1.21" - break - case 'rei': - runtimeOnly "me.shedaniel:RoughlyEnoughItems-neoforge:16.0.729" - runtimeOnly "dev.architectury:architectury-neoforge:13.0.1" - runtimeOnly "curse.maven:cloth-config-348521:5424576" - break - case 'jei': - runtimeOnly "mezz.jei:jei-1.21.1-neoforge:19.21.0.247" - runtimeOnly "curse.maven:ae2-jei-integration-1074338:5748513" - break - } + runtimeOnly "dev.emi:emi-neoforge:${emi_version}+1.21" + runtimeOnly "mezz.jei:jei-1.21.1-neoforge:19.21.0.247" + runtimeOnly "curse.maven:ae2-jei-integration-1074338:5748513" } // This block of code expands all declared replace properties in the specified resource targets. diff --git a/gradle.properties b/gradle.properties index ed7c9ca..c9bb96e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,47 +1,25 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. org.gradle.jvmargs=-Xmx1G org.gradle.daemon=true org.gradle.parallel=true org.gradle.caching=true org.gradle.configuration-cache=true -#read more on this at https://github.com/neoforged/ModDevGradle?tab=readme-ov-file#better-minecraft-parameter-names--javadoc-parchment -# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started parchment_minecraft_version=1.21.1 parchment_mappings_version=2024.11.17 -# Environment Properties -# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge -# The Minecraft version must agree with the Neo version to get a valid artifact minecraft_version=1.21.1 -# The Minecraft version range can use any release version of Minecraft as bounds. -# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly -# as they do not follow standard versioning conventions. minecraft_version_range=[1.21.1] -# The Neo version must agree with the Minecraft version to get a valid artifact neo_version=21.1.206 -# The loader version range can only use the major version of FML as bounds loader_version_range=[1,) ## Mod Properties - -# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} -# Must match the String constant located in the main mod class annotated with @Mod. mod_id=extendedae_plus -# The human-readable display name for the mod. mod_name=ExtendedAE-Plus -# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. -mod_license=All Rights Reserved -# The mod version. See https://semver.org/ -mod_version=1.21.1-1.4.0-fix -# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. -# This should match the base package used for the mod sources. -# See https://maven.apache.org/guides/mini/guide-naming-conventions.html +mod_license=MIT +mod_version=1.0.0 mod_group_id=com.extendedae_plus -# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors=YourNameHere, OtherNameHere -# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Example mod description.\nNewline characters can be used and will be replaced properly. +mod_authors=GaLicn, XianYuFish001 +mod_description= -## UI item explorer selection (emi | rei | jei) -# Default to 'emi' per request; you can override by running with -Puse_Xei=rei or -Puse_Xei=jei -use_Xei=jei + +## Dependencies Properties +emi_version=1.1.10 diff --git a/src/main/java/com/extendedae_plus/Config.java b/src/main/java/com/extendedae_plus/Config.java deleted file mode 100644 index 044ba3b..0000000 --- a/src/main/java/com/extendedae_plus/Config.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.extendedae_plus; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.event.config.ModConfigEvent; -import net.neoforged.neoforge.common.ModConfigSpec; - -// An example config class. This is not required, but it's a good idea to have one to keep your config organized. -// Demonstrates how to use Neo's config APIs -public class Config { - private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); - - public static final ModConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER - .comment("Whether to log the dirt block on common setup") - .define("logDirtBlock", true); - - public static final ModConfigSpec.IntValue MAGIC_NUMBER = BUILDER - .comment("A magic number") - .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); - - public static final ModConfigSpec.ConfigValue MAGIC_NUMBER_INTRODUCTION = BUILDER - .comment("What you want the introduction message to be for the magic number") - .define("magicNumberIntroduction", "The magic number is... "); - - // a list of strings that are treated as resource locations for items - public static final ModConfigSpec.ConfigValue> ITEM_STRINGS = BUILDER - .comment("A list of items to log on common setup.") - .defineListAllowEmpty("items", List.of("minecraft:iron_ingot"), () -> "", Config::validateItemName); - - static final ModConfigSpec SPEC = BUILDER.build(); - - private static boolean validateItemName(final Object obj) { - return obj instanceof String itemName && BuiltInRegistries.ITEM.containsKey(ResourceLocation.parse(itemName)); - } -} diff --git a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java index 5a6277c..f11d489 100644 --- a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java +++ b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java @@ -5,7 +5,7 @@ import appeng.block.AEBaseEntityBlock; import appeng.blockentity.crafting.CraftingBlockEntity; import com.extendedae_plus.ae.api.storage.InfinityBigIntegerCellHandler; import com.extendedae_plus.ae.api.storage.InfinityBigIntegerCellInventory; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.init.*; import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.util.storage.InfinityStorageManager; @@ -18,7 +18,6 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; -import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.level.LevelEvent; @@ -44,6 +43,14 @@ public class ExtendedAEPlus { // 注册能力:让 AE2 电缆识别我们的 In-World Grid Node Host modEventBus.addListener(ModCapabilities::onRegisterCapabilities); + /* + TODO + 将这literal地狱烧成灰(bushi + 反正就是引入dataGeneration, 多写点translatable + 顺便不小心露出我无敌的component工具类( + 还有改一下config的结构 + */ + // 注册本模组方块/物品/创造物品栏 ModBlocks.BLOCKS.register(modEventBus); ModItems.ITEMS.register(modEventBus); @@ -62,7 +69,7 @@ public class ExtendedAEPlus { NeoForge.EVENT_BUS.addListener(InfinityBigIntegerCellInventory::onServerStopping); // 注册配置:接入自定义的 ModConfigs - modContainer.registerConfig(ModConfig.Type.COMMON, ModConfigs.COMMON_SPEC); + modContainer.registerConfig(net.neoforged.fml.config.ModConfig.Type.COMMON, ModConfig.COMMON_SPEC); } // 便捷 ResourceLocation 工具 diff --git a/src/main/java/com/extendedae_plus/client/ClientModelEvents.java b/src/main/java/com/extendedae_plus/client/ClientModelEvents.java index 5e74c08..8d6a2b8 100644 --- a/src/main/java/com/extendedae_plus/client/ClientModelEvents.java +++ b/src/main/java/com/extendedae_plus/client/ClientModelEvents.java @@ -1,11 +1,11 @@ package com.extendedae_plus.client; import com.extendedae_plus.ExtendedAEPlus; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ModelEvent; -import net.minecraft.client.resources.model.ModelResourceLocation; /** * 确保在模型烘焙/资源重载期间也会注册内置模型,避免在刷新资源后丢失内置模型映射。 diff --git a/src/main/java/com/extendedae_plus/client/ClientProxy.java b/src/main/java/com/extendedae_plus/client/ClientProxy.java index 5a7d020..8f62cdb 100644 --- a/src/main/java/com/extendedae_plus/client/ClientProxy.java +++ b/src/main/java/com/extendedae_plus/client/ClientProxy.java @@ -3,16 +3,14 @@ package com.extendedae_plus.client; import appeng.client.render.crafting.CraftingCubeModel; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.client.render.crafting.EPlusCraftingCubeModelProvider; -import com.extendedae_plus.client.screen.GlobalProviderModesScreen; -import com.extendedae_plus.init.ModMenuTypes; import com.extendedae_plus.content.crafting.EPlusCraftingUnitType; import com.extendedae_plus.hooks.BuiltInModelHooks; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraft.client.gui.screens.MenuScreens; -import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; -import net.neoforged.fml.common.EventBusSubscriber; +import com.extendedae_plus.init.ModMenuTypes; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; /** * 客户端模型注册,将 formed 模型注册为内置模型。 diff --git a/src/main/java/com/extendedae_plus/client/InputEvents.java b/src/main/java/com/extendedae_plus/client/InputEvents.java index 48c81e5..9c50d82 100644 --- a/src/main/java/com/extendedae_plus/client/InputEvents.java +++ b/src/main/java/com/extendedae_plus/client/InputEvents.java @@ -2,92 +2,70 @@ package com.extendedae_plus.client; import appeng.api.stacks.GenericStack; import appeng.client.gui.me.common.MEStorageScreen; +import appeng.core.AEConfig; import com.extendedae_plus.ExtendedAEPlus; -import com.extendedae_plus.integration.jei.JeiRuntimeProxy; import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor; import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket; import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; -import mezz.jei.api.ingredients.ITypedIngredient; +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; -import java.util.Optional; +import java.util.List; @EventBusSubscriber(modid = ExtendedAEPlus.MODID, value = Dist.CLIENT) public final class InputEvents { private InputEvents() {} - // 临时适配:在缺少 AE2 的 JEI 辅助类时,仅尝试从 JEI 提供的原生 ItemStack 获取;否则不处理。 - private static GenericStack toGenericStack(ITypedIngredient typed) { + private static GenericStack toGenericStack(EmiStack stack) { try { - Optional maybe = typed.getItemStack(); - if (maybe.isPresent()) { - ItemStack is = maybe.get(); - // 尝试使用 AE2 的通用构造(若不可用则返回 null) - try { - return GenericStack.fromItemStack(is); - } catch (Throwable ignored) { - return null; - } - } - } catch (Throwable ignored) { - } + 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(ScreenEvent.MouseButtonPressed.Pre event) { + public static void onMouseButtonPre(InputEvent.MouseButton.Pre event) { + if (event.getAction() != GLFW.GLFW_PRESS) return; + if (Minecraft.getInstance().screen == null) return; // 优先处理:Shift + 左键(拉取或下单) if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_LEFT && Screen.hasShiftDown()) { - double mouseX = event.getMouseX(); - double mouseY = event.getMouseY(); - Optional> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY); - if (hovered.isEmpty()) { - hovered = JeiRuntimeProxy.getIngredientUnderMouse(); - } - if (hovered.isPresent()) { - // 若 JEI 作弊模式开启,则放行给 JEI 处理(Shift+左键=一组) - if (JeiRuntimeProxy.isJeiCheatModeEnabled()) { - return; - } - ITypedIngredient typed = hovered.get(); - GenericStack stack = toGenericStack(typed); - if (stack != null) { - // 发送到服务端:若网络有库存则拉取一组到空槽,否则若可合成则打开下单界面 - PacketDistributor.sendToServer(new PullFromJeiOrCraftC2SPacket(stack)); - // 消费此次点击,避免 JEI/原版对左键的其它处理 - event.setCanceled(true); - return; - } - } + // 🤓哎wc这Jemi兼容层怎么这么好用啊( + // 😡我们要完全去jei化, 不准用 + // 😭 + // Optional> hovered = new JemiBookmarkOverlay().getIngredientUnderMouse(); + List stacks = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); + if (stacks.isEmpty()) return; + GenericStack stack = toGenericStack(stacks.getFirst()); + if (stack == null) return; + PacketDistributor.sendToServer(new PullFromJeiOrCraftC2SPacket(stack)); } // 中键:打开 AE 下单界面(保持原有功能) if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) { // 优先在 JEI 配方界面基于坐标获取;若无,再从覆盖层/书签获取 - double mouseX = event.getMouseX(); - double mouseY = event.getMouseY(); - Optional> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY); - if (hovered.isEmpty()) { - hovered = JeiRuntimeProxy.getIngredientUnderMouse(); - } - if (hovered.isEmpty()) return; + List stacks = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); + if (stacks.isEmpty()) return; - ITypedIngredient typed = hovered.get(); - // 若 JEI 作弊模式开启,则放行给 JEI 处理(中键=一组) - if (JeiRuntimeProxy.isJeiCheatModeEnabled()) { - return; - } - GenericStack stack = toGenericStack(typed); + GenericStack stack = toGenericStack(stacks.getFirst()); if (stack == null) return; // 发送到服务端,让其验证并打开 CraftAmountMenu @@ -103,32 +81,34 @@ public final class InputEvents { if (event.getKeyCode() != GLFW.GLFW_KEY_F) return; // 仅当鼠标确实悬停在 JEI 配料上时触发 - Optional> hovered = JeiRuntimeProxy.getIngredientUnderMouse(); - if (hovered.isEmpty()) return; - - ITypedIngredient typed = hovered.get(); - - // 通用获取显示名称(兼容物品/流体等) - String name = JeiRuntimeProxy.getTypedIngredientDisplayName(typed); - if (name == null || name.isEmpty()) return; + // 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗? + List stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); + if (stack.isEmpty()) return; + String name = stack.getFirst().getName().getString(); + if (name.isEmpty()) return; // 写入 AE2 终端的搜索框 var screen = Minecraft.getInstance().screen; if (screen instanceof MEStorageScreen me) { try { - MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me; - acc.eap$getSearchField().setValue(name); - acc.eap$setSearchText(name); // 同步到 Repo 并刷新 + // 如果用EMI搜索框 + if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); + else { + MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me; + acc.eap$getSearchField().setValue(name); + acc.eap$setSearchText(name); // 同步到 Repo 并刷新 + } event.setCanceled(true); - return; - } catch (Throwable ignored) { - } - }else if (screen instanceof GuiExPatternTerminal gpt) { + } catch (Throwable ignored) {} + } else if (screen instanceof GuiExPatternTerminal gpt) { try { - GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt; - acc.getSearchField().setValue(name); + if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); + else { + GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt; + acc.getSearchField().setValue(name); + } event.setCanceled(true); - }catch (Throwable ignored) {} + } catch (Throwable ignored) {} } } } 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 11426b6..f0704e0 100644 --- a/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java +++ b/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java @@ -1,6 +1,5 @@ package com.extendedae_plus.client.ui; -import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.network.UploadEncodedPatternToProviderC2SPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; diff --git a/src/main/java/com/extendedae_plus/config/ModConfigs.java b/src/main/java/com/extendedae_plus/config/ModConfig.java similarity index 72% rename from src/main/java/com/extendedae_plus/config/ModConfigs.java rename to src/main/java/com/extendedae_plus/config/ModConfig.java index 7a3ae32..7ea735f 100644 --- a/src/main/java/com/extendedae_plus/config/ModConfigs.java +++ b/src/main/java/com/extendedae_plus/config/ModConfig.java @@ -2,53 +2,61 @@ package com.extendedae_plus.config; import net.neoforged.neoforge.common.ModConfigSpec; -public final class ModConfigs { +public final class ModConfig { public static final ModConfigSpec COMMON_SPEC; public static final ModConfigSpec.IntValue PAGE_MULTIPLIER; public static final ModConfigSpec.DoubleValue WIRELESS_MAX_RANGE; public static final ModConfigSpec.BooleanValue WIRELESS_CROSS_DIM_ENABLE; - public static final ModConfigSpec.BooleanValue SHOW_ENCOD_PATTERN_PLAYER; + public static final ModConfigSpec.BooleanValue SHOW_ENCODE_PATTERN_PLAYER; public static final ModConfigSpec.BooleanValue PROVIDER_ROUND_ROBIN_ENABLE; public static final ModConfigSpec.BooleanValue PATTERN_TERMINAL_SHOW_SLOTS_DEFAULT; public static final ModConfigSpec.IntValue SMART_SCALING_MAX_MULTIPLIER; + public static final ModConfigSpec.BooleanValue OVERRIDE_AE2WT_PICKING; + public static final ModConfigSpec.BooleanValue INDEPENDENT_UPLOADING_BUTTON; static { ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); // General settings builder.push("general"); - PAGE_MULTIPLIER = builder - .comment( + PAGE_MULTIPLIER = builder.comment( "扩展样板供应器总槽位容量的倍率", "基础为36,每页仍显示36格,倍率会增加总页数/总容量", "建议范围 1-16") .defineInRange("pageMultiplier", 1, 1, 64); // 是否显示样板编码玩家(通用) - SHOW_ENCOD_PATTERN_PLAYER = builder - .comment( + SHOW_ENCODE_PATTERN_PLAYER = builder.comment( "是否显示样板编码玩家", - "开启后将在样板 HoverText 上添加样板的编码玩家" - ) + "开启后将在样板 HoverText 上添加样板的编码玩家") .define("showEncoderPatternPlayer", true); // 模式访问终端(ExtendedAE 图样终端)默认是否显示槽位渲染(SlotsRow)。 // true: 默认显示(可通过界面按钮临时隐藏);false: 默认隐藏(可通过按钮显示) - PATTERN_TERMINAL_SHOW_SLOTS_DEFAULT = builder - .comment( + PATTERN_TERMINAL_SHOW_SLOTS_DEFAULT = builder.comment( "样板终端默认是否显示槽位", - "影响进入界面时SlotsRow的默认可见性,仅影响客户端显示" - ) + "影响进入界面时SlotsRow的默认可见性,仅影响客户端显示") .define("patternTerminalShowSlotsDefault", true); + OVERRIDE_AE2WT_PICKING = builder + .translation("config.extendedae_plus.override_ae2wt_picking") + .comment("是否覆盖AE2WT使用中键从终端选取方块的逻辑", + "开启后选取方块的数量将不被限制在32个", + "(不建议使用,在EMI环境下可能出现奇怪bug)") + .define("overrideAE2WTPicking", false); + + INDEPENDENT_UPLOADING_BUTTON = builder + .translation("config.extendedae_plus.independent_uploading_button") + .comment("启用后,在样板编码终端会出现一个独立的按钮用于上传样板") + .define("independentUploadingButton", false); + // end general builder.pop(); // Smart-scaling group builder.push("smartScaling"); // 智能倍增:是否在样板供应器间轮询分配请求量(开启:按 provider 均分;关闭:不拆分) - PROVIDER_ROUND_ROBIN_ENABLE = builder - .comment( + PROVIDER_ROUND_ROBIN_ENABLE = builder.comment( "智能倍增时是否对样板供应器轮询分配", "仅多个供应器有相同样板时生效,开启后请求会均分到所有可用供应器,关闭则全部分配给单一供应器", "注意:所有相关供应器需开启智能倍增,否则可能失效", @@ -57,8 +65,7 @@ public final class ModConfigs { // 智能倍增的最大倍数(以单次样板产出为单位)。 // 0 表示不限制;>0 表示最大倍增倍数上限,例如 64 表示最多放大到 64 倍。 - SMART_SCALING_MAX_MULTIPLIER = builder - .comment( + SMART_SCALING_MAX_MULTIPLIER = builder.comment( "智能倍增的最大倍数(0 表示不限制)", "此倍数是针对单次样板产出的放大倍数上限,用于限制一次推送中按倍增缩放的规模") .defineInRange("smartScalingMaxMultiplier", 0, 0, 1048576); @@ -69,24 +76,23 @@ public final class ModConfigs { builder.push("wireless"); // 无线收发器:最大连接距离(单位:方块)。 // 一对多从端连接主端时,将以该值作为范围限制。 - WIRELESS_MAX_RANGE = builder - .comment( + WIRELESS_MAX_RANGE = builder.comment( "无线收发器最大连接距离(单位:方块)", "从端与主端的直线距离需小于等于该值才会建立连接。") .defineInRange("wirelessMaxRange", 256.0D, 1.0D, 4096.0D); // 是否允许跨维度连接(忽略维度差异进行频道传输)。 - WIRELESS_CROSS_DIM_ENABLE = builder - .comment( + WIRELESS_CROSS_DIM_ENABLE = builder.comment( "是否允许无线收发器跨维度建立连接", "开启后,从端可连接到不同维度的主端(忽略距离限制)") .define("wirelessCrossDimEnable", true); builder.pop(); // pop wireless + // builder.pop(); // pop extendedae_plus COMMON_SPEC = builder.build(); } - private ModConfigs() {} + private ModConfig() {} } diff --git a/src/main/java/com/extendedae_plus/content/ClientPatternHighlightStore.java b/src/main/java/com/extendedae_plus/content/ClientPatternHighlightStore.java index 2e9f0c4..1c8953d 100644 --- a/src/main/java/com/extendedae_plus/content/ClientPatternHighlightStore.java +++ b/src/main/java/com/extendedae_plus/content/ClientPatternHighlightStore.java @@ -1,8 +1,6 @@ package com.extendedae_plus.content; import appeng.api.stacks.AEKey; -import appeng.api.crafting.IPatternDetails; -import appeng.client.gui.me.patternaccess.PatternContainerRecord; import java.util.Collections; import java.util.HashSet; diff --git a/src/main/java/com/extendedae_plus/content/controller/NetworkPatternControllerBlockEntity.java b/src/main/java/com/extendedae_plus/content/controller/NetworkPatternControllerBlockEntity.java index 7f18aa4..72b5a61 100644 --- a/src/main/java/com/extendedae_plus/content/controller/NetworkPatternControllerBlockEntity.java +++ b/src/main/java/com/extendedae_plus/content/controller/NetworkPatternControllerBlockEntity.java @@ -1,20 +1,13 @@ package com.extendedae_plus.content.controller; -import appeng.api.networking.GridHelper; -import appeng.api.networking.GridFlags; -import appeng.api.networking.IGridNode; -import appeng.api.networking.IGridNodeListener; -import appeng.api.networking.IInWorldGridNodeHost; -import appeng.api.networking.IManagedGridNode; +import appeng.api.networking.*; import com.extendedae_plus.init.ModBlockEntities; -import com.extendedae_plus.init.ModMenuTypes; import com.extendedae_plus.menu.NetworkPatternControllerMenu; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/extendedae_plus/content/crafting/EPlusCraftingUnitType.java b/src/main/java/com/extendedae_plus/content/crafting/EPlusCraftingUnitType.java index e02270c..c5ec41d 100644 --- a/src/main/java/com/extendedae_plus/content/crafting/EPlusCraftingUnitType.java +++ b/src/main/java/com/extendedae_plus/content/crafting/EPlusCraftingUnitType.java @@ -1,9 +1,8 @@ package com.extendedae_plus.content.crafting; import appeng.block.crafting.ICraftingUnitType; -import net.minecraft.world.item.Item; - import com.extendedae_plus.init.ModItems; +import net.minecraft.world.item.Item; public enum EPlusCraftingUnitType implements ICraftingUnitType { ACCELERATOR_4x(0, 4), diff --git a/src/main/java/com/extendedae_plus/hooks/WrenchHook.java b/src/main/java/com/extendedae_plus/hooks/WrenchHook.java index c5a4a22..5166fe8 100644 --- a/src/main/java/com/extendedae_plus/hooks/WrenchHook.java +++ b/src/main/java/com/extendedae_plus/hooks/WrenchHook.java @@ -1,10 +1,9 @@ package com.extendedae_plus.hooks; +import appeng.block.crafting.CraftingUnitBlock; import appeng.util.InteractionUtil; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity; -import appeng.block.crafting.CraftingUnitBlock; -import appeng.blockentity.crafting.CraftingBlockEntity; import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -14,7 +13,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.bus.api.Event; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; diff --git a/src/main/java/com/extendedae_plus/init/ModBlockEntities.java b/src/main/java/com/extendedae_plus/init/ModBlockEntities.java index 9ba9b57..6325291 100644 --- a/src/main/java/com/extendedae_plus/init/ModBlockEntities.java +++ b/src/main/java/com/extendedae_plus/init/ModBlockEntities.java @@ -1,11 +1,11 @@ package com.extendedae_plus.init; -import com.extendedae_plus.ExtendedAEPlus; -import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity; -import com.extendedae_plus.content.controller.NetworkPatternControllerBlockEntity; import appeng.blockentity.crafting.CraftingBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; +import com.extendedae_plus.ExtendedAEPlus; +import com.extendedae_plus.content.controller.NetworkPatternControllerBlockEntity; +import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity; import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; diff --git a/src/main/java/com/extendedae_plus/init/ModBlocks.java b/src/main/java/com/extendedae_plus/init/ModBlocks.java index 2944276..c6d0b01 100644 --- a/src/main/java/com/extendedae_plus/init/ModBlocks.java +++ b/src/main/java/com/extendedae_plus/init/ModBlocks.java @@ -1,11 +1,9 @@ package com.extendedae_plus.init; -import com.extendedae_plus.ExtendedAEPlus; -import com.extendedae_plus.content.wireless.WirelessTransceiverBlock; -import com.extendedae_plus.content.crafting.EPlusCraftingUnitType; import appeng.block.crafting.CraftingUnitBlock; -import appeng.blockentity.crafting.CraftingBlockEntity; -import appeng.core.definitions.AEBlockEntities; +import com.extendedae_plus.ExtendedAEPlus; +import com.extendedae_plus.content.crafting.EPlusCraftingUnitType; +import com.extendedae_plus.content.wireless.WirelessTransceiverBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MapColor; diff --git a/src/main/java/com/extendedae_plus/init/ModMenuTypes.java b/src/main/java/com/extendedae_plus/init/ModMenuTypes.java index 960ece9..72f91cc 100644 --- a/src/main/java/com/extendedae_plus/init/ModMenuTypes.java +++ b/src/main/java/com/extendedae_plus/init/ModMenuTypes.java @@ -2,11 +2,11 @@ package com.extendedae_plus.init; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.menu.NetworkPatternControllerMenu; -import net.minecraft.world.inventory.MenuType; import net.minecraft.core.registries.Registries; +import net.minecraft.world.inventory.MenuType; +import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; public final class ModMenuTypes { private ModMenuTypes() {} diff --git a/src/main/java/com/extendedae_plus/integration/jei/ExtendedAEJeiPlugin.java b/src/main/java/com/extendedae_plus/integration/jei/ExtendedAEJeiPlugin.java deleted file mode 100644 index 8c249a2..0000000 --- a/src/main/java/com/extendedae_plus/integration/jei/ExtendedAEJeiPlugin.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.extendedae_plus.integration.jei; - -import com.extendedae_plus.ExtendedAEPlus; -import mezz.jei.api.IModPlugin; -import mezz.jei.api.JeiPlugin; -import mezz.jei.api.runtime.IJeiRuntime; -import net.minecraft.resources.ResourceLocation; - -@JeiPlugin -public class ExtendedAEJeiPlugin implements IModPlugin { - private static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "jei_plugin"); - - @Override - public ResourceLocation getPluginUid() { - return UID; - } - - @Override - public void onRuntimeAvailable(IJeiRuntime jeiRuntime) { - JeiRuntimeProxy.setRuntime(jeiRuntime); - } -} diff --git a/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java b/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java deleted file mode 100644 index b5e76f7..0000000 --- a/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.extendedae_plus.integration.jei; - -import com.extendedae_plus.mixin.jei.accessor.BookmarkOverlayAccessor; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.ingredients.ITypedIngredient; -import mezz.jei.api.runtime.IBookmarkOverlay; -import mezz.jei.api.runtime.IIngredientListOverlay; -import mezz.jei.api.runtime.IJeiRuntime; -import mezz.jei.gui.bookmarks.BookmarkList; -import mezz.jei.gui.bookmarks.IngredientBookmark; -import mezz.jei.gui.overlay.elements.IElement; -import net.minecraft.world.item.ItemStack; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -/** - * 线程安全地缓存并访问 JEI Runtime。 - */ -public final class JeiRuntimeProxy { - private static volatile IJeiRuntime RUNTIME; - - private JeiRuntimeProxy() {} - - static void setRuntime(IJeiRuntime runtime) { - RUNTIME = runtime; - } - - @Nullable - public static IJeiRuntime get() { - return RUNTIME; - } - - public static Optional> getIngredientUnderMouse() { - IJeiRuntime rt = RUNTIME; - if (rt == null) return Optional.empty(); - - IIngredientListOverlay list = rt.getIngredientListOverlay(); - if (list != null) { - var ing = list.getIngredientUnderMouse(); - if (ing.isPresent()) return ing.map(i -> (ITypedIngredient) i); - } - IBookmarkOverlay bm = rt.getBookmarkOverlay(); - if (bm != null) { - var ing = bm.getIngredientUnderMouse(); - if (ing.isPresent()) return ing.map(i -> (ITypedIngredient) i); - } - return Optional.empty(); - } - - /** - * 在 JEI 配方界面区域内,基于屏幕坐标查询鼠标下的配料(优先物品,其次流体)。 - */ - public static Optional> getIngredientUnderMouse(double mouseX, double mouseY) { - IJeiRuntime rt = RUNTIME; - if (rt == null || rt.getRecipesGui() == null) return Optional.empty(); - - var ingredientManager = rt.getIngredientManager(); - - // 支持物品(通用且所有版本可用)。如需流体可后续按版本判断再扩展 - var item = rt.getRecipesGui().getIngredientUnderMouse(VanillaTypes.ITEM_STACK) - .flatMap(v -> ingredientManager.createTypedIngredient(VanillaTypes.ITEM_STACK, v)) - .map(x -> (ITypedIngredient) x); - if (item.isPresent()) return Optional.of(item.get()); - - return Optional.empty(); - } - - /** - * 检测 JEI 是否开启了作弊模式(给物品)。 - * 使用 JEI 内部开关,若 JEI 未初始化或异常则返回 false。 - */ - public static boolean isJeiCheatModeEnabled() { - try { - // 使用完全限定名以避免在源码缺失时的编译依赖问题 - return mezz.jei.common.Internal.getClientToggleState().isCheatItemsEnabled(); - } catch (Throwable t) { - return false; - } - } - - /** - * 将文本写入 JEI 的搜索过滤框。 - * 若 JEI runtime 不可用则静默返回。 - */ - public static void setIngredientFilterText(String text) { - IJeiRuntime rt = RUNTIME; - if (rt == null) return; - try { - rt.getIngredientFilter().setFilterText(text == null ? "" : text); - } catch (Throwable ignored) { - // 兼容不同 JEI 版本或在启动阶段尚未就绪 - } - } - - /** - * 通用获取 JEI 悬浮配料的本地化显示名称(适配物品/流体等)。 - * 若无法安全获取,则返回空字符串。 - */ - public static String getTypedIngredientDisplayName(ITypedIngredient typed) { - IJeiRuntime rt = RUNTIME; - if (rt == null || typed == null) return ""; - try { - var manager = rt.getIngredientManager(); - var helper = manager.getIngredientHelper(typed.getType()); - // JEI 的 IIngredientHelper#getDisplayName 返回 Component(新版本)或 String(旧版本) - // 统一转为字符串,使用 toString() 兜底 - Object display = helper.getDisplayName(typed.getIngredient()); - if (display == null) return ""; - // 新版:net.minecraft.network.chat.Component - if (display instanceof net.minecraft.network.chat.Component comp) { - String s = comp.getString(); - return s == null ? "" : s; - } - String s = display.toString(); - return s == null ? "" : s; - } catch (Throwable ignored) { - } - return ""; - } - - /** - * 获取JEI书签列表 - */ - public static List> getBookmarkList() { - IJeiRuntime rt = RUNTIME; - if (rt == null) return Collections.emptyList(); - IBookmarkOverlay bookmarkOverlay = rt.getBookmarkOverlay(); - if (bookmarkOverlay instanceof BookmarkOverlayAccessor accessor) { - BookmarkList bookmarkList = accessor.eap$getBookmarkList(); - return bookmarkList.getElements().stream().map(IElement::getTypedIngredient).toList(); - } - return Collections.emptyList(); - } - - /** - * 将物品添加到 JEI 书签 - */ - public static void addBookmark(ItemStack stack) { - IJeiRuntime rt = RUNTIME; - if (rt == null || stack == null || stack.isEmpty()) return; - - IBookmarkOverlay overlay = rt.getBookmarkOverlay(); - if (overlay instanceof BookmarkOverlayAccessor accessor) { - BookmarkList list = accessor.eap$getBookmarkList(); - try { - var typedOpt = rt.getIngredientManager().createTypedIngredient(VanillaTypes.ITEM_STACK, stack); - typedOpt.ifPresent(typed -> { - IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); - list.add(bookmark); // add 内部会自动保存到配置 - }); - } catch (Throwable ignored) {} - } - } - - /** - * 从 JEI 书签移除物品 - */ - public static void removeBookmark(ItemStack stack) { - IJeiRuntime rt = RUNTIME; - if (rt == null || stack == null || stack.isEmpty()) return; - - IBookmarkOverlay overlay = rt.getBookmarkOverlay(); - if (overlay instanceof BookmarkOverlayAccessor accessor) { - BookmarkList list = accessor.eap$getBookmarkList(); - try { - var typedOpt = rt.getIngredientManager().createTypedIngredient(VanillaTypes.ITEM_STACK, stack); - typedOpt.ifPresent(typed -> { - IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); - list.remove(bookmark); - }); - } catch (Throwable ignored) {} - } - } -} diff --git a/src/main/java/com/extendedae_plus/menu/NetworkPatternControllerMenu.java b/src/main/java/com/extendedae_plus/menu/NetworkPatternControllerMenu.java index 7282492..8dc7ce2 100644 --- a/src/main/java/com/extendedae_plus/menu/NetworkPatternControllerMenu.java +++ b/src/main/java/com/extendedae_plus/menu/NetworkPatternControllerMenu.java @@ -2,12 +2,12 @@ package com.extendedae_plus.menu; import com.extendedae_plus.init.ModMenuTypes; import net.minecraft.core.BlockPos; -import org.jetbrains.annotations.Nullable; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; public class NetworkPatternControllerMenu extends AbstractContainerMenu { private final BlockPos bePos; diff --git a/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost.java b/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost.java index 3ff3bff..6cbd377 100644 --- a/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost.java +++ b/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost.java @@ -1,8 +1,8 @@ package com.extendedae_plus.menu.host; +import appeng.api.storage.ISubMenuHost; import appeng.menu.ISubMenu; import appeng.menu.locator.ItemMenuHostLocator; -import appeng.api.storage.ISubMenuHost; import de.mari_023.ae2wtlib.api.terminal.ItemWT; import de.mari_023.ae2wtlib.api.terminal.WTMenuHost; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost2.java b/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost2.java index 8d2b9bf..7449199 100644 --- a/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost2.java +++ b/src/main/java/com/extendedae_plus/menu/host/CuriosWTSubMenuHost2.java @@ -1,8 +1,8 @@ package com.extendedae_plus.menu.host; -import appeng.items.tools.powered.WirelessTerminalItem; -import appeng.helpers.WirelessTerminalMenuHost; import appeng.api.storage.ISubMenuHost; +import appeng.helpers.WirelessTerminalMenuHost; +import appeng.items.tools.powered.WirelessTerminalItem; import appeng.menu.ISubMenu; import appeng.menu.locator.ItemMenuHostLocator; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java b/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java index 9d5b43a..cbc28c2 100644 --- a/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java +++ b/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java @@ -1,12 +1,12 @@ package com.extendedae_plus.menu.host; import appeng.helpers.WirelessTerminalMenuHost; -import appeng.menu.ISubMenu; import appeng.items.tools.powered.WirelessTerminalItem; +import appeng.menu.ISubMenu; import appeng.menu.locator.ItemMenuHostLocator; +import com.extendedae_plus.menu.locator.CuriosItemLocator; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import com.extendedae_plus.menu.locator.CuriosItemLocator; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; /** diff --git a/src/main/java/com/extendedae_plus/mixin/PickFromWirelessMixin.java b/src/main/java/com/extendedae_plus/mixin/PickFromWirelessMixin.java index 53f88ce..511ccbb 100644 --- a/src/main/java/com/extendedae_plus/mixin/PickFromWirelessMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/PickFromWirelessMixin.java @@ -1,5 +1,6 @@ package com.extendedae_plus.mixin; +import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.network.PickFromWirelessC2SPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -12,6 +13,7 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.network.PacketDistributor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -24,46 +26,51 @@ public class PickFromWirelessMixin { @Shadow public HitResult hitResult; @Inject(method = "pickBlock", at = @At("HEAD"), cancellable = true) - private void eap$pickFromAeWireless(CallbackInfo ci) { + private void onPickBlock(CallbackInfo ci) { + if (ModConfig.OVERRIDE_AE2WT_PICKING.getAsBoolean() && eaep$overridePicking()) + ci.cancel(); + } + + @Unique + private boolean eaep$overridePicking() { if (this.player == null || this.hitResult == null || this.hitResult.getType() != HitResult.Type.BLOCK) { - return; + return false; } // 仅生存模式 GameType type = Minecraft.getInstance().gameMode != null ? Minecraft.getInstance().gameMode.getPlayerMode() : null; if (type == null || type.isCreative()) { - return; + return false; } // 若背包已有该物品,让原版逻辑处理(将该物品切换到主手) BlockHitResult bhr = (BlockHitResult) this.hitResult; var level = Minecraft.getInstance().level; - if (level != null) { - try { - BlockState state = level.getBlockState(bhr.getBlockPos()); - if (state != null && !state.isAir()) { - ItemStack picked = state.getBlock().getCloneItemStack(state, bhr, level, bhr.getBlockPos(), this.player); - if (picked.isEmpty()) { - picked = state.getBlock().asItem().getDefaultInstance(); - } - if (!picked.isEmpty()) { - // 若主手已拿同一物品(含标签),则仍然走 AE 拉取逻辑进行补充/合并 - if (!ItemStack.isSameItemSameComponents(picked, this.player.getMainHandItem())) { - int slot = this.player.getInventory().findSlotMatchingItem(picked); - if (slot != -1) { - return; // 交给原版 pickBlock 处理 - } + if (level == null) return false; + try { + BlockState state = level.getBlockState(bhr.getBlockPos()); + if (state != null && !state.isAir()) { + ItemStack picked = state.getBlock().getCloneItemStack(state, bhr, level, bhr.getBlockPos(), this.player); + if (picked.isEmpty()) { + picked = state.getBlock().asItem().getDefaultInstance(); + } + if (!picked.isEmpty()) { + // 若主手已拿同一物品(含标签),则仍然走 AE 拉取逻辑进行补充/合并 + if (!ItemStack.isSameItemSameComponents(picked, this.player.getMainHandItem())) { + int slot = this.player.getInventory().findSlotMatchingItem(picked); + if (slot != -1) { + return false; // 交给原版 pickBlock 处理 } } } - } catch (Throwable t) { - // 若其它模组导致 getCloneItemStack 出异常,放弃拦截,保持原版行为,确保健壮性 - return; } + } catch (Throwable ignored) { + // 若其它模组导致 getCloneItemStack 出异常,放弃拦截,保持原版行为,确保健壮性 + return false; } // 不在客户端检查是否持有无线合成终端,由服务端权威校验(含 Curios 支持),以避免整合包环境下的软依赖与槽位问题 // 背包没有:发送到服务端处理(从 AE2 网络拉取)并拦截原版 Vec3 loc = bhr.getLocation(); PacketDistributor.sendToServer(new PickFromWirelessC2SPacket(bhr.getBlockPos(), bhr.getDirection(), loc)); - ci.cancel(); + return true; } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java index efb4106..b1d19fe 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java @@ -1,14 +1,14 @@ package com.extendedae_plus.mixin.ae2; import appeng.crafting.pattern.EncodedPatternItem; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import net.minecraft.ChatFormatting; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.CustomData; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.CustomData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -21,7 +21,7 @@ public class EncodedPatternItemMixin { // 客户端:在 HoverText 显示样板的编码玩家 @Inject(method = "appendHoverText", at = @At("TAIL")) public void epp$appendHoverText(ItemStack stack, Item.TooltipContext context, List lines, TooltipFlag advancedTooltips, CallbackInfo ci){ - if (ModConfigs.SHOW_ENCOD_PATTERN_PLAYER.get()) { + if (ModConfig.SHOW_ENCODE_PATTERN_PLAYER.get()) { var customData = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY); var tag = customData.copyTag(); if (tag.contains("encodePlayer")) { diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternEncodingTermMenuAccessor.java b/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternEncodingTermMenuAccessor.java index 908962c..2a2f0f8 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternEncodingTermMenuAccessor.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternEncodingTermMenuAccessor.java @@ -2,8 +2,10 @@ package com.extendedae_plus.mixin.ae2.accessor; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(PatternEncodingTermMenu.class) public interface PatternEncodingTermMenuAccessor { @@ -12,4 +14,10 @@ public interface PatternEncodingTermMenuAccessor { @Accessor("blankPatternSlot") RestrictedInputSlot eap$getBlankPatternSlot(); + + @Invoker("encodePattern") + ItemStack eaep$encodePattern(); + + @Invoker("isPattern") + boolean eaep$isPattern(ItemStack output); } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingTreeProcessMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingTreeProcessMixin.java index 68e510e..f4d0b38 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingTreeProcessMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingTreeProcessMixin.java @@ -10,7 +10,7 @@ import appeng.crafting.CraftingTreeProcess; import appeng.crafting.pattern.AEProcessingPattern; import appeng.me.service.CraftingService; import com.extendedae_plus.api.SmartDoublingAwarePattern; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.content.ScaledProcessingPattern; import com.extendedae_plus.util.PatternScaler; import com.extendedae_plus.util.RequestedAmountHolder; @@ -58,7 +58,7 @@ public abstract class CraftingTreeProcessMixin { // 根据配置决定是否在 provider 间轮询分配请求量(默认开启) long perProvider = 1L; - if (!ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.get()) { + if (!ModConfig.PROVIDER_ROUND_ROBIN_ENABLE.get()) { // 关闭轮询:直接使用完整请求量,不需要查询 provider 列表 perProvider = requested; if (perProvider <= 0) perProvider = 1L; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/AEBaseScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/AEBaseScreenMixin.java index bf5f561..b423345 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/AEBaseScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/AEBaseScreenMixin.java @@ -17,7 +17,6 @@ import com.extendedae_plus.api.ExPatternPageAccessor; import com.extendedae_plus.content.ClientPatternHighlightStore; import com.extendedae_plus.network.CraftingMonitorJumpC2SPacket; import com.extendedae_plus.network.CraftingMonitorOpenProviderC2SPacket; -import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.util.GuiUtil; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import com.mojang.logging.LogUtils; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermScreenMixin.java index e61295d..97a6505 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermScreenMixin.java @@ -6,7 +6,7 @@ import appeng.client.gui.me.items.PatternEncodingTermScreen; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.WidgetStyle; import appeng.client.gui.widgets.IconButton; -import appeng.menu.AEBaseMenu; +import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.mixin.accessor.AbstractContainerScreenAccessor; import com.extendedae_plus.mixin.accessor.ScreenAccessor; import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor; @@ -28,7 +28,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; * 通过解析 AE2 样式中 encodePattern 的坐标,将按钮放在其左侧紧挨位置。 */ @Mixin(value = AEBaseScreen.class, remap = false) -public abstract class PatternEncodingTermScreenMixin { +public abstract class PatternEncodingTermScreenMixin { @Unique private IconButton eap$uploadBtn; @@ -36,9 +36,9 @@ public abstract class PatternEncodingTermScreenMixin { @Inject(method = "init", at = @At("TAIL"), remap = false) private void eap$addUploadButton(CallbackInfo ci) { // 仅在图样编码终端界面中添加按钮 - if (!(((Object) this) instanceof PatternEncodingTermScreen)) { + if (!(((Object) this) instanceof PatternEncodingTermScreen && + ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean())) return; - } // 复用已存在的按钮实例,避免重复创建 if (eap$uploadBtn == null) { eap$uploadBtn = new IconButton(btn -> PacketDistributor @@ -98,12 +98,12 @@ public abstract class PatternEncodingTermScreenMixin { // 解析 encodePattern 的样式位置 try { - ScreenStyle style = ((AEBaseScreenAccessor) (Object) this).eap$getStyle(); + ScreenStyle style = ((AEBaseScreenAccessor) this).eap$getStyle(); WidgetStyle ws = style.getWidget("encodePattern"); - int leftPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getLeftPos(); - int topPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getTopPos(); - int imageWidth = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageWidth(); - int imageHeight = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageHeight(); + int leftPos = ((AbstractContainerScreenAccessor) this).eap$getLeftPos(); + int topPos = ((AbstractContainerScreenAccessor) this).eap$getTopPos(); + int imageWidth = ((AbstractContainerScreenAccessor) this).eap$getImageWidth(); + int imageHeight = ((AbstractContainerScreenAccessor) this).eap$getImageHeight(); Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight); var pos = ws.resolve(bounds); int baseW = ws.getWidth() > 0 ? ws.getWidth() : 12; @@ -120,15 +120,15 @@ public abstract class PatternEncodingTermScreenMixin { // 回退:放在界面右侧大致位置,避免不可见 eap$uploadBtn.setWidth(12); eap$uploadBtn.setHeight(12); - int leftPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getLeftPos(); - int topPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getTopPos(); - int imageWidth = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageWidth(); + int leftPos = ((AbstractContainerScreenAccessor) this).eap$getLeftPos(); + int topPos = ((AbstractContainerScreenAccessor) this).eap$getTopPos(); + int imageWidth = ((AbstractContainerScreenAccessor) this).eap$getImageWidth(); eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); // 向右微移 2px eap$uploadBtn.setY(topPos + 88); } // 直接向 renderables / children 列表添加,避免依赖受保护方法 - var accessor = (ScreenAccessor) (Object) this; + var accessor = (ScreenAccessor) this; var renderables = accessor.eap$getRenderables(); var children = accessor.eap$getChildren(); if (!renderables.contains(eap$uploadBtn)) { @@ -141,22 +141,22 @@ public abstract class PatternEncodingTermScreenMixin { @Inject(method = "containerTick", at = @At("TAIL"), remap = false) private void eap$ensureUploadButton(CallbackInfo ci) { - if (!(((Object) this) instanceof PatternEncodingTermScreen)) { + if (!(((Object) this) instanceof PatternEncodingTermScreen && + ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean())) return; - } if (eap$uploadBtn == null) { return; } - var renderables2 = ((ScreenAccessor) (Object) this).eap$getRenderables(); + var renderables2 = ((ScreenAccessor) this).eap$getRenderables(); if (!renderables2.contains(eap$uploadBtn)) { // 被其它模组清空/替换后,重新计算一次位置并补回 try { - ScreenStyle style = ((AEBaseScreenAccessor) (Object) this).eap$getStyle(); + ScreenStyle style = ((AEBaseScreenAccessor) this).eap$getStyle(); WidgetStyle ws = style.getWidget("encodePattern"); - int leftPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getLeftPos(); - int topPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getTopPos(); - int imageWidth = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageWidth(); - int imageHeight = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageHeight(); + int leftPos = ((AbstractContainerScreenAccessor) this).eap$getLeftPos(); + int topPos = ((AbstractContainerScreenAccessor) this).eap$getTopPos(); + int imageWidth = ((AbstractContainerScreenAccessor) this).eap$getImageWidth(); + int imageHeight = ((AbstractContainerScreenAccessor) this).eap$getImageHeight(); Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight); var pos = ws.resolve(bounds); int baseW = ws.getWidth() > 0 ? ws.getWidth() : 16; @@ -168,15 +168,15 @@ public abstract class PatternEncodingTermScreenMixin { eap$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2,再右移 2px eap$uploadBtn.setY(pos.getY()); } catch (Throwable t) { - int leftPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getLeftPos(); - int topPos = ((AbstractContainerScreenAccessor) (Object) this).eap$getTopPos(); - int imageWidth = ((AbstractContainerScreenAccessor) (Object) this).eap$getImageWidth(); + int leftPos = ((AbstractContainerScreenAccessor) this).eap$getLeftPos(); + int topPos = ((AbstractContainerScreenAccessor) this).eap$getTopPos(); + int imageWidth = ((AbstractContainerScreenAccessor) this).eap$getImageWidth(); eap$uploadBtn.setWidth(12); eap$uploadBtn.setHeight(12); eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); eap$uploadBtn.setY(topPos + 88); } - var accessor2 = (ScreenAccessor) (Object) this; + var accessor2 = (ScreenAccessor) this; var r = accessor2.eap$getRenderables(); var c = accessor2.eap$getChildren(); if (!r.contains(eap$uploadBtn)) { diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java index 3990ae3..bcbd67d 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java @@ -8,7 +8,6 @@ import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderTarget; import com.extendedae_plus.api.AdvancedBlockingHolder; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java index ad455d6..09975e2 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java @@ -7,7 +7,6 @@ import com.extendedae_plus.api.SmartDoublingAwarePattern; import com.extendedae_plus.api.SmartDoublingHolder; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderLogicPatternsAccessor; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java index 1245d59..b4f257c 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java @@ -7,12 +7,12 @@ import appeng.parts.encoding.EncodingMode; import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.glodblock.github.glodium.network.packet.sync.ActionMap; import com.glodblock.github.glodium.network.packet.sync.IActionHolder; +import net.minecraft.core.component.DataComponents; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; -import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.component.CustomData; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -21,9 +21,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Map; -import java.util.function.Consumer; - /** * 给 AE2 的 PatternEncodingTermMenu 增加一个通用动作持有者,实现接收 EPP 的 CGenericPacket 动作。 * 注册动作 "upload_to_matrix":仅上传“合成图样”到 ExtendedAE 装配矩阵。 diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java index 9280311..915188e 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java @@ -3,8 +3,10 @@ package com.extendedae_plus.mixin.ae2.menu; import appeng.menu.me.crafting.CraftConfirmMenu; import appeng.menu.me.crafting.CraftingPlanSummary; import appeng.menu.me.crafting.CraftingPlanSummaryEntry; -import com.extendedae_plus.integration.jei.JeiRuntimeProxy; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.runtime.EmiFavorites; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.world.item.crafting.Ingredient; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -46,7 +48,8 @@ public class CraftConfirmMenuGoBackMixin { var display = entry.getWhat().wrapForDisplayOrFilter(); if (display != null && !display.isEmpty()) { // wrapForDisplayOrFilter 返回 ItemStack - JeiRuntimeProxy.addBookmark(display); +// JeiRuntimeProxy.addBookmark(display); + EmiFavorites.addFavorite(EmiIngredient.of(Ingredient.of(display))); } } catch (Throwable ignored) {} } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java index 87b6bd0..2cbb08f 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java @@ -11,9 +11,15 @@ import appeng.helpers.IPatternTerminalMenuHost; import appeng.menu.me.common.MEStorageMenu; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; +import appeng.parts.encoding.EncodingMode; +import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor; +import com.extendedae_plus.network.C2SPacketEncodeFinished; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; +import net.neoforged.neoforge.network.PacketDistributor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -23,7 +29,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PatternEncodingTermMenu.class) public abstract class PatternEncodingTermMenuMixin { - // 防止重复执行 @Unique private boolean eap$blankAutoFilled = false; @@ -31,6 +36,9 @@ public abstract class PatternEncodingTermMenuMixin { @Shadow private RestrictedInputSlot blankPatternSlot; + @Shadow + public EncodingMode mode; + @Unique private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) { try { @@ -40,10 +48,10 @@ public abstract class PatternEncodingTermMenuMixin { return; } // 必须可与网络交互 - var acc = (MEStorageMenuAccessor) (Object) ((MEStorageMenu) self); + var acc = (MEStorageMenuAccessor) self; MEStorage storage = acc.getStorage(); IEnergySource power = acc.getEnergySource(); - boolean canInteract = storage != null && power != null && ((MEStorageMenu) self).getLinkStatus().connected(); + boolean canInteract = storage != null && power != null && self.getLinkStatus().connected(); if (!canInteract) { return; } @@ -149,4 +157,12 @@ public abstract class PatternEncodingTermMenuMixin { } this.eap$blankAutoFilled = true; } + + @Inject(method = "encode", at = @At("TAIL")) + private void eaep$onEncode(CallbackInfo ci) { + if (ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean()) return; + if (!Screen.hasShiftDown()) return; + var self = (PatternEncodingTermMenu) (Object) this; + PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE); + } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java index ac8b3b7..c6a0e32 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java @@ -1,15 +1,11 @@ package com.extendedae_plus.mixin.ae2.menu; import appeng.helpers.patternprovider.PatternProviderLogic; -import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.menu.AEBaseMenu; import appeng.menu.guisync.GuiSync; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.AdvancedBlockingHolder; import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; -import com.extendedae_plus.util.ExtendedAELogger; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java index adcffba..ee1b172 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java @@ -6,8 +6,6 @@ import appeng.menu.guisync.GuiSync; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.PatternProviderMenuDoublingSync; import com.extendedae_plus.api.SmartDoublingHolder; -import com.extendedae_plus.util.ExtendedAELogger; -import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/com/extendedae_plus/mixin/ae2WTlib/ContainerUWirelessExPatternTerminalMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2WTlib/ContainerUWirelessExPatternTerminalMixin.java deleted file mode 100644 index 19defb5..0000000 --- a/src/main/java/com/extendedae_plus/mixin/ae2WTlib/ContainerUWirelessExPatternTerminalMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.extendedae_plus.mixin.ae2WTlib; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * 为通用无线样板访问终端(AE2WTlib 集成)容器注册通用动作(CGenericPacket 分发) - */ -@Pseudo -@Mixin(targets = "com.glodblock.github.extendedae.xmod.wt.ContainerUWirelessExPAT", remap = false) -public abstract class ContainerUWirelessExPatternTerminalMixin { - - // 1.21 环境下,Glodium IActionHolder 已被移除,改为 no-op 保留占位,以便未来扩展。 - // 明确目标构造签名:(int, Inventory, HostUWirelessExPAT) - @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Ljava/lang/Object;)V", at = @At("TAIL"), remap = false) - private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, Object host, CallbackInfo ci) { - // no-op - } -} diff --git a/src/main/java/com/extendedae_plus/mixin/emi/MixinEncodePatternTransfer.java b/src/main/java/com/extendedae_plus/mixin/emi/MixinEncodePatternTransfer.java new file mode 100644 index 0000000..10f5fdd --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/emi/MixinEncodePatternTransfer.java @@ -0,0 +1,30 @@ +package com.extendedae_plus.mixin.emi; + +import appeng.integration.modules.emi.EmiEncodePatternHandler; +import appeng.integration.modules.itemlists.EncodingHelper; +import appeng.menu.AEBaseMenu; +import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; +import dev.emi.emi.api.recipe.EmiRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; +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.CallbackInfoReturnable; + +@Mixin(value = EmiEncodePatternHandler.class, remap = false) +public abstract class MixinEncodePatternTransfer { + @Inject(method = "transferRecipe(Lappeng/menu/AEBaseMenu;Lnet/minecraft/world/item/crafting/RecipeHolder;Ldev/emi/emi/api/recipe/EmiRecipe;Z)Lappeng/integration/modules/emi/AbstractRecipeHandler$Result;", + at = @At("HEAD"), remap = false, require = 0) + private static void onTransfer(AEBaseMenu menu, RecipeHolder holder, + EmiRecipe emiRecipe, boolean doTransfer, CallbackInfoReturnable cir) { + if (!doTransfer) return; + var recipe = holder != null ? holder.value() : null; + // 技术力不够,忍痛不兼容gtceu( + // 对不起老牛😭 + if (recipe == null) return; + if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return; + String name = ExtendedAEPatternUploadUtil.mapRecipeTypeToSearchKey(recipe); + if (name == null || name.isBlank()) return; + ExtendedAEPatternUploadUtil.setLastProcessingName(name); + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/jei/EncodingHelperMixin.java b/src/main/java/com/extendedae_plus/mixin/emi/MixinEncodingHelper.java similarity index 59% rename from src/main/java/com/extendedae_plus/mixin/jei/EncodingHelperMixin.java rename to src/main/java/com/extendedae_plus/mixin/emi/MixinEncodingHelper.java index eb563d3..1d14b9f 100644 --- a/src/main/java/com/extendedae_plus/mixin/jei/EncodingHelperMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/emi/MixinEncodingHelper.java @@ -1,4 +1,4 @@ -package com.extendedae_plus.mixin.jei; +package com.extendedae_plus.mixin.emi; import appeng.api.stacks.AEFluidKey; import appeng.api.stacks.AEItemKey; @@ -6,32 +6,31 @@ import appeng.api.stacks.AEKey; import appeng.integration.modules.itemlists.EncodingHelper; import appeng.menu.me.common.GridInventoryEntry; import appeng.menu.me.common.MEStorageMenu; -import com.extendedae_plus.integration.jei.JeiRuntimeProxy; -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.neoforge.NeoForgeTypes; -import mezz.jei.api.ingredients.ITypedIngredient; +import dev.emi.emi.runtime.EmiFavorites; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.material.Fluid; 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.CallbackInfoReturnable; import java.util.Comparator; -import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @Mixin(EncodingHelper.class) -public class EncodingHelperMixin { +public class MixinEncodingHelper { // 客户端:注入优先使用JEI书签的物品,流体 @Inject(method = "getIngredientPriorities", at = @At("TAIL"), cancellable = true, remap = false) private static void epp$addJeiIngredientPriorities(MEStorageMenu menu, Comparator comparator, CallbackInfoReturnable> cir){ Map result = cir.getReturnValue(); AtomicInteger index = new AtomicInteger(Integer.MAX_VALUE); - List> list = JeiRuntimeProxy.getBookmarkList(); - for (ITypedIngredient ingredient : list) { - ingredient.getIngredient(VanillaTypes.ITEM_STACK).ifPresent(itemStack -> result.put(AEItemKey.of(itemStack), index.getAndDecrement())); - ingredient.getIngredient(NeoForgeTypes.FLUID_STACK).ifPresent(fluidStack -> result.put(AEFluidKey.of(fluidStack), index.getAndDecrement())); - } + EmiFavorites.favorites.forEach(favorite -> { + Object stack = favorite.getEmiStacks().getFirst().getKey(); + if (stack instanceof Item item) result.put(AEItemKey.of(item), index.getAndDecrement()); + else if (stack instanceof Fluid fluid) result.put(AEFluidKey.of(fluid), index.getAndDecrement()); + }); cir.setReturnValue(result); + } } diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java index 5c1f520..622a048 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java @@ -7,14 +7,13 @@ import appeng.menu.SlotSemantics; import appeng.menu.slot.AppEngSlot; import com.extendedae_plus.NewIcon; import com.extendedae_plus.api.ExPatternButtonsAccessor; -import com.extendedae_plus.api.ExPatternPageAccessor; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; +import com.extendedae_plus.network.ScalePatternsC2SPacket; import com.glodblock.github.extendedae.client.button.ActionEPPButton; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import com.glodblock.github.extendedae.container.ContainerExPatternProvider; -import net.minecraft.network.chat.Component; import net.minecraft.client.Minecraft; -import com.extendedae_plus.network.ScalePatternsC2SPacket; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -66,7 +65,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen 1) return cfg; } catch (Throwable ignored) {} try { @@ -125,7 +124,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen ItemStack itemToUpload = this.minecraft.player.getInventory().getItem(playerSlotIndex); if (!itemToUpload.isEmpty() && PatternDetailsHelper.isEncodedPattern(itemToUpload)) { - // 改用我们自己的网络包,直接将玩家槽位与选择的供应器ID发送到服务器 + // 什么逆天ide的中文语法检查( + // 改用我们自己的网络包,直接将玩家槽位 与 选择的供应器ID发送到服务器 try { PacketDistributor.sendToServer(new com.extendedae_plus.network.UploadInventoryPatternToProviderC2SPacket( playerSlotIndex, @@ -245,14 +238,6 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen } } - /** - * 重置当前选择的样板供应器ID - */ - @Unique - public void resetCurrentlyChoicePatternProvider() { - this.eap$currentlyChoicePatterProvider = -1; - } - @Inject(method = "(Lcom/glodblock/github/extendedae/container/ContainerExPatternTerminal;Lnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/network/chat/Component;Lappeng/client/gui/style/ScreenStyle;)V", at = @At("TAIL"), remap = false, require = 0) private void injectConstructor(com.glodblock.github.extendedae.container.ContainerExPatternTerminal menu, Inventory playerInventory, @@ -261,7 +246,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen CallbackInfo ci) { // 根据配置初始化默认显示/隐藏状态 try { - this.eap$showSlots = ModConfigs.PATTERN_TERMINAL_SHOW_SLOTS_DEFAULT.get(); + this.eap$showSlots = ModConfig.PATTERN_TERMINAL_SHOW_SLOTS_DEFAULT.get(); } catch (Throwable ignored) { } // 创建切换槽位显示的按钮 diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/common/PartExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/common/PartExPatternProviderMixin.java index 1334add..5a4b58a 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/common/PartExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/common/PartExPatternProviderMixin.java @@ -1,6 +1,6 @@ package com.extendedae_plus.mixin.extendedae.common; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import com.glodblock.github.extendedae.common.parts.PartExPatternProvider; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; @@ -20,7 +20,7 @@ public abstract class PartExPatternProviderMixin { index = 2 ) private int eap$multiplyCapacity(int original) { - int mult = ModConfigs.PAGE_MULTIPLIER.get(); + int mult = ModConfig.PAGE_MULTIPLIER.get(); if (mult < 1) mult = 1; if (mult > 64) mult = 64; return Math.max(1, original) * mult; diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/common/TileExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/common/TileExPatternProviderMixin.java index bb7ac07..7259c9e 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/common/TileExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/common/TileExPatternProviderMixin.java @@ -1,6 +1,6 @@ package com.extendedae_plus.mixin.extendedae.common; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,7 +18,7 @@ public abstract class TileExPatternProviderMixin { index = 2 ) private int eap$multiplyCapacity(int original) { - int mult = ModConfigs.PAGE_MULTIPLIER.get(); + int mult = ModConfig.PAGE_MULTIPLIER.get(); if (mult < 1) mult = 1; if (mult > 64) mult = 64; return Math.max(1, original) * mult; diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java index a91cb09..d4fa16c 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java @@ -13,7 +13,6 @@ import com.glodblock.github.extendedae.container.ContainerExPatternProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; -import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/com/extendedae_plus/mixin/hooks/ModelBakeryMixin.java b/src/main/java/com/extendedae_plus/mixin/hooks/ModelBakeryMixin.java index fe9c6e8..f3a0f8c 100644 --- a/src/main/java/com/extendedae_plus/mixin/hooks/ModelBakeryMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/hooks/ModelBakeryMixin.java @@ -1,16 +1,14 @@ package com.extendedae_plus.mixin.hooks; +import com.extendedae_plus.hooks.BuiltInModelHooks; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; 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.CallbackInfoReturnable; -import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.client.resources.model.UnbakedModel; -import net.minecraft.resources.ResourceLocation; - -import com.extendedae_plus.hooks.BuiltInModelHooks; - /** * 复制 MAE2/AE2 的做法:在模型加载时优先查询我们的内置模型表, * 若命中则缓存并阻止继续查找 JSON 模型。 diff --git a/src/main/java/com/extendedae_plus/mixin/jei/AE2JeiEncodePatternTransferHandlerMixin.java b/src/main/java/com/extendedae_plus/mixin/jei/AE2JeiEncodePatternTransferHandlerMixin.java deleted file mode 100644 index 149df60..0000000 --- a/src/main/java/com/extendedae_plus/mixin/jei/AE2JeiEncodePatternTransferHandlerMixin.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.extendedae_plus.mixin.jei; - -import appeng.integration.modules.itemlists.EncodingHelper; -import appeng.menu.me.items.PatternEncodingTermMenu; -import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; -import mezz.jei.api.gui.ingredient.IRecipeSlotsView; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeHolder; -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.CallbackInfoReturnable; -import tamaized.ae2jeiintegration.integration.modules.jei.transfer.EncodePatternTransferHandler; - -/** - * 针对 AE2 JEI Integration 的转移处理器:在点击 JEI 的 "+" 将配方填入编码终端时, - * 捕获处理配方并记录一个可用于搜索的关键字,以便 ProviderSelectScreen 自动预填搜索框。 - */ -@Mixin(value = EncodePatternTransferHandler.class, remap = false) -public abstract class AE2JeiEncodePatternTransferHandlerMixin { - - @Inject(method = "transferRecipe", at = @At("HEAD"), require = 0, remap = false) - private void extendedae_plus$captureProcessingName(T menu, - Object recipeBase, - IRecipeSlotsView slotsView, - Player player, - boolean maxTransfer, - boolean doTransfer, - CallbackInfoReturnable cir) { - if (!doTransfer) return; - String name = null; - Recipe recipe = null; - if (recipeBase instanceof RecipeHolder holder) { - recipe = holder.value(); - } - if (recipe != null) { - // 仅记录处理配方(非 3x3 合成) - if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return; - name = ExtendedAEPatternUploadUtil.mapRecipeTypeToSearchKey(recipe); - } else { - // 非原版 Recipe 的显示,尝试从 recipeBase 类名/包名推导关键词 - name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(recipeBase); - } - if (name != null && !name.isBlank()) { - ExtendedAEPatternUploadUtil.setLastProcessingName(name); - } - } -} diff --git a/src/main/java/com/extendedae_plus/mixin/jei/EncodePatternTransferHandlerMixin.java b/src/main/java/com/extendedae_plus/mixin/jei/EncodePatternTransferHandlerMixin.java deleted file mode 100644 index 805bb53..0000000 --- a/src/main/java/com/extendedae_plus/mixin/jei/EncodePatternTransferHandlerMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.extendedae_plus.mixin.jei; - -import appeng.integration.modules.itemlists.EncodingHelper; -import appeng.integration.modules.rei.transfer.EncodePatternTransferHandler; -import appeng.menu.me.items.PatternEncodingTermMenu; -import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeHolder; -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.CallbackInfoReturnable; -import me.shedaniel.rei.api.common.display.Display; - -/** - * 捕获通过 JEI 点击 + 填充到样板编码终端的处理配方,并记录其工艺名称(如“烧炼”)。 - */ -@Mixin(value = EncodePatternTransferHandler.class, remap = false) -public abstract class EncodePatternTransferHandlerMixin { - - @Inject(method = "transferRecipe", at = @At("HEAD"), require = 0, remap = false) - private void extendedae_plus$captureProcessingName(PatternEncodingTermMenu menu, - RecipeHolder holder, - Display display, - boolean doTransfer, - CallbackInfoReturnable cir) { - if (!doTransfer) return; - String name = null; - Recipe recipe = holder != null ? holder.value() : null; - if (recipe != null) { - // 仅记录处理配方(非 3x3 合成) - if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return; - name = ExtendedAEPatternUploadUtil.mapRecipeTypeToSearchKey(recipe); - } else { - // 非原版 Recipe 的显示,尝试从 display 类名/包名推导关键词 - name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(display); - } - if (name != null && !name.isBlank()) { - ExtendedAEPatternUploadUtil.setLastProcessingName(name); - } - } -} diff --git a/src/main/java/com/extendedae_plus/mixin/jei/accessor/BookmarkOverlayAccessor.java b/src/main/java/com/extendedae_plus/mixin/jei/accessor/BookmarkOverlayAccessor.java deleted file mode 100644 index 508845d..0000000 --- a/src/main/java/com/extendedae_plus/mixin/jei/accessor/BookmarkOverlayAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.extendedae_plus.mixin.jei.accessor; - -import mezz.jei.gui.bookmarks.BookmarkList; -import mezz.jei.gui.overlay.bookmarks.BookmarkOverlay; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(BookmarkOverlay.class) -public interface BookmarkOverlayAccessor { - @Accessor("bookmarkList") - BookmarkList eap$getBookmarkList(); -} diff --git a/src/main/java/com/extendedae_plus/network/C2SPacketEncodeFinished.java b/src/main/java/com/extendedae_plus/network/C2SPacketEncodeFinished.java new file mode 100644 index 0000000..343c5f4 --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/C2SPacketEncodeFinished.java @@ -0,0 +1,27 @@ +package com.extendedae_plus.network; + +import com.extendedae_plus.ExtendedAEPlus; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +public record C2SPacketEncodeFinished() implements CustomPacketPayload { + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "encode_finished")); + + @Override + public Type type() { + return TYPE; + } + + public static final C2SPacketEncodeFinished INSTANCE = new C2SPacketEncodeFinished(); + + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); + + public static void handle(final C2SPacketEncodeFinished packet, final IPayloadContext context) { + if (context.player().level().isClientSide) PacketDistributor.sendToServer(RequestProvidersListC2SPacket.INSTANCE); + } +} diff --git a/src/main/java/com/extendedae_plus/network/CraftingMonitorJumpC2SPacket.java b/src/main/java/com/extendedae_plus/network/CraftingMonitorJumpC2SPacket.java index 6b4f843..c5e6e19 100644 --- a/src/main/java/com/extendedae_plus/network/CraftingMonitorJumpC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/CraftingMonitorJumpC2SPacket.java @@ -2,7 +2,6 @@ package com.extendedae_plus.network; import appeng.api.crafting.IPatternDetails; import appeng.api.networking.IGrid; -import appeng.api.networking.crafting.ICraftingProvider; import appeng.api.networking.security.IActionHost; import appeng.api.stacks.AEKey; import appeng.helpers.patternprovider.PatternProviderLogic; @@ -18,12 +17,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.MenuProvider; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.Collection; diff --git a/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java b/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java index d32d5a6..4a4cf14 100644 --- a/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java @@ -17,13 +17,12 @@ import com.glodblock.github.extendedae.util.FCClientUtil; import com.glodblock.github.glodium.util.GlodUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java b/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java index ef6774b..ac50014 100644 --- a/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/GlobalToggleProviderModesC2SPacket.java @@ -3,6 +3,7 @@ package com.extendedae_plus.network; import appeng.api.config.Settings; import appeng.api.config.YesNo; import appeng.api.networking.IGrid; +import appeng.api.networking.IInWorldGridNodeHost; import appeng.blockentity.crafting.PatternProviderBlockEntity; import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderLogicHost; @@ -10,18 +11,17 @@ import appeng.parts.crafting.PatternProviderPart; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.api.AdvancedBlockingHolder; import com.extendedae_plus.api.SmartDoublingHolder; -import appeng.api.networking.IInWorldGridNodeHost; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.neoforged.neoforge.network.handling.IPayloadContext; -import java.util.Set; import java.util.HashSet; +import java.util.Set; /** * C2S:全网批量切换样板供应器的三种模式: diff --git a/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java b/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java index 3cd1d17..16dfc5f 100644 --- a/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java @@ -1,7 +1,7 @@ package com.extendedae_plus.network; -import appeng.menu.implementations.InterfaceMenu; import appeng.api.stacks.GenericStack; +import appeng.menu.implementations.InterfaceMenu; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; diff --git a/src/main/java/com/extendedae_plus/network/ModNetwork.java b/src/main/java/com/extendedae_plus/network/ModNetwork.java index 6a57257..349dadf 100644 --- a/src/main/java/com/extendedae_plus/network/ModNetwork.java +++ b/src/main/java/com/extendedae_plus/network/ModNetwork.java @@ -23,14 +23,18 @@ public class ModNetwork { registrar.playToServer(UploadEncodedPatternToProviderC2SPacket.TYPE, UploadEncodedPatternToProviderC2SPacket.STREAM_CODEC, UploadEncodedPatternToProviderC2SPacket::handle); registrar.playToServer(UploadInventoryPatternToProviderC2SPacket.TYPE, UploadInventoryPatternToProviderC2SPacket.STREAM_CODEC, UploadInventoryPatternToProviderC2SPacket::handle); // 新增:JEI 中键打开合成界面 & 无线终端拾取方块物品 - registrar.playToServer(com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.TYPE, - com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.STREAM_CODEC, - com.extendedae_plus.network.OpenCraftFromJeiC2SPacket::handle); - registrar.playToServer(com.extendedae_plus.network.PickFromWirelessC2SPacket.TYPE, - com.extendedae_plus.network.PickFromWirelessC2SPacket.STREAM_CODEC, - com.extendedae_plus.network.PickFromWirelessC2SPacket::handle); - registrar.playToServer(com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket.TYPE, - com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket.STREAM_CODEC, - com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket::handle); + registrar.playToServer(OpenCraftFromJeiC2SPacket.TYPE, + OpenCraftFromJeiC2SPacket.STREAM_CODEC, + OpenCraftFromJeiC2SPacket::handle); + registrar.playToServer(PickFromWirelessC2SPacket.TYPE, + PickFromWirelessC2SPacket.STREAM_CODEC, + PickFromWirelessC2SPacket::handle); + registrar.playToServer(PullFromJeiOrCraftC2SPacket.TYPE, + PullFromJeiOrCraftC2SPacket.STREAM_CODEC, + PullFromJeiOrCraftC2SPacket::handle); + + registrar.playToClient(C2SPacketEncodeFinished.TYPE, + C2SPacketEncodeFinished.STREAM_CODEC, + C2SPacketEncodeFinished::handle); } } diff --git a/src/main/java/com/extendedae_plus/network/OpenProviderUiC2SPacket.java b/src/main/java/com/extendedae_plus/network/OpenProviderUiC2SPacket.java index 691d452..4586eca 100644 --- a/src/main/java/com/extendedae_plus/network/OpenProviderUiC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/OpenProviderUiC2SPacket.java @@ -1,22 +1,18 @@ package com.extendedae_plus.network; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.InteractionResult; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.MenuProvider; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.neoforge.network.handling.IPayloadContext; public class OpenProviderUiC2SPacket implements CustomPacketPayload { diff --git a/src/main/java/com/extendedae_plus/network/SetPatternHighlightS2CPacket.java b/src/main/java/com/extendedae_plus/network/SetPatternHighlightS2CPacket.java index affd830..d07f760 100644 --- a/src/main/java/com/extendedae_plus/network/SetPatternHighlightS2CPacket.java +++ b/src/main/java/com/extendedae_plus/network/SetPatternHighlightS2CPacket.java @@ -1,8 +1,8 @@ package com.extendedae_plus.network; import appeng.api.stacks.AEKey; -import com.extendedae_plus.content.ClientPatternHighlightStore; import com.extendedae_plus.ExtendedAEPlus; +import com.extendedae_plus.content.ClientPatternHighlightStore; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; diff --git a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java index c64655f..6777a90 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java @@ -1,17 +1,17 @@ package com.extendedae_plus.network; +import appeng.api.config.Settings; +import appeng.api.config.YesNo; import appeng.menu.implementations.PatternProviderMenu; +import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.api.AdvancedBlockingHolder; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; -import com.extendedae_plus.ExtendedAEPlus; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.server.level.ServerPlayer; -import appeng.api.config.Settings; -import appeng.api.config.YesNo; +import net.neoforged.neoforge.network.handling.IPayloadContext; /** * C2S:切换高级阻挡模式。 diff --git a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java index 2e2bd82..1c28db2 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java @@ -1,15 +1,15 @@ package com.extendedae_plus.network; import appeng.menu.implementations.PatternProviderMenu; +import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.api.SmartDoublingHolder; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; -import com.extendedae_plus.ExtendedAEPlus; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; /** * C2S:切换智能翻倍启用状态。 diff --git a/src/main/java/com/extendedae_plus/util/ExtendedAEPatternUploadUtil.java b/src/main/java/com/extendedae_plus/util/ExtendedAEPatternUploadUtil.java index c49cf6f..65d4b8c 100644 --- a/src/main/java/com/extendedae_plus/util/ExtendedAEPatternUploadUtil.java +++ b/src/main/java/com/extendedae_plus/util/ExtendedAEPatternUploadUtil.java @@ -4,20 +4,18 @@ import appeng.api.crafting.IPatternDetails; import appeng.api.crafting.PatternDetailsHelper; import appeng.api.inventories.InternalInventory; import appeng.api.networking.IGrid; -import appeng.api.networking.IGridNode; -import appeng.core.definitions.AEItems; -import appeng.menu.AEBaseMenu; import appeng.api.networking.security.IActionHost; +import appeng.core.definitions.AEItems; import appeng.crafting.pattern.AECraftingPattern; import appeng.crafting.pattern.AESmithingTablePattern; import appeng.crafting.pattern.AEStonecuttingPattern; import appeng.helpers.patternprovider.PatternContainer; +import appeng.menu.AEBaseMenu; import appeng.menu.implementations.PatternAccessTermMenu; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.util.inv.FilteredInternalInventory; import appeng.util.inv.filter.IAEItemFilter; import com.extendedae_plus.mixin.ae2.accessor.PatternEncodingTermMenuAccessor; -import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixBase; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; @@ -35,7 +33,10 @@ import java.io.IOException; import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** diff --git a/src/main/java/com/extendedae_plus/util/PatternScaler.java b/src/main/java/com/extendedae_plus/util/PatternScaler.java index 537d52c..bb6a343 100644 --- a/src/main/java/com/extendedae_plus/util/PatternScaler.java +++ b/src/main/java/com/extendedae_plus/util/PatternScaler.java @@ -4,15 +4,13 @@ import appeng.api.crafting.IPatternDetails.IInput; import appeng.api.stacks.AEKey; import appeng.api.stacks.GenericStack; import appeng.crafting.pattern.AEProcessingPattern; -import com.extendedae_plus.content.ScaledProcessingPattern; import com.extendedae_plus.api.SmartDoublingAwarePattern; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; +import com.extendedae_plus.content.ScaledProcessingPattern; import java.util.ArrayList; import java.util.List; -import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; - public final class PatternScaler { private PatternScaler() { } @@ -65,7 +63,7 @@ public final class PatternScaler { } // 应用配置的最大倍数上限(0 表示不限制) try { - int maxMul = ModConfigs.SMART_SCALING_MAX_MULTIPLIER.get(); + int maxMul = ModConfig.SMART_SCALING_MAX_MULTIPLIER.get(); if (maxMul > 0 && multiplier > maxMul) { multiplier = maxMul; } diff --git a/src/main/java/com/extendedae_plus/wireless/WirelessMasterRegistry.java b/src/main/java/com/extendedae_plus/wireless/WirelessMasterRegistry.java index 408bab0..5977f49 100644 --- a/src/main/java/com/extendedae_plus/wireless/WirelessMasterRegistry.java +++ b/src/main/java/com/extendedae_plus/wireless/WirelessMasterRegistry.java @@ -1,6 +1,6 @@ package com.extendedae_plus.wireless; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; @@ -63,7 +63,7 @@ public final class WirelessMasterRegistry { } private static boolean useGlobal() { - return ModConfigs.WIRELESS_CROSS_DIM_ENABLE.get(); + return ModConfig.WIRELESS_CROSS_DIM_ENABLE.get(); } private record Key(ResourceKey dim, long freq) { diff --git a/src/main/java/com/extendedae_plus/wireless/WirelessSlaveLink.java b/src/main/java/com/extendedae_plus/wireless/WirelessSlaveLink.java index cc8988a..7cb3941 100644 --- a/src/main/java/com/extendedae_plus/wireless/WirelessSlaveLink.java +++ b/src/main/java/com/extendedae_plus/wireless/WirelessSlaveLink.java @@ -3,7 +3,7 @@ package com.extendedae_plus.wireless; import appeng.api.networking.GridHelper; import appeng.api.networking.IGridNode; import appeng.me.service.helpers.ConnectionWrapper; -import com.extendedae_plus.config.ModConfigs; +import com.extendedae_plus.config.ModConfig; import net.minecraft.server.level.ServerLevel; import java.util.Objects; @@ -64,12 +64,12 @@ public class WirelessSlaveLink { shutdown = false; distance = 0.0D; - boolean crossDim = ModConfigs.WIRELESS_CROSS_DIM_ENABLE.get(); + boolean crossDim = ModConfig.WIRELESS_CROSS_DIM_ENABLE.get(); if (master != null && !master.isEndpointRemoved() && (crossDim || master.getServerLevel() == level)) { if (!crossDim) { distance = Math.sqrt(master.getBlockPos().distSqr(host.getBlockPos())); } - double maxRange = ModConfigs.WIRELESS_MAX_RANGE.get(); + double maxRange = ModConfig.WIRELESS_MAX_RANGE.get(); if (crossDim || distance <= maxRange) { // 保持/建立连接 try { diff --git a/src/main/resources/assets/extendedae_plus/lang/en_us.json b/src/main/resources/assets/extendedae_plus/lang/en_us.json index 4072712..d328408 100644 --- a/src/main/resources/assets/extendedae_plus/lang/en_us.json +++ b/src/main/resources/assets/extendedae_plus/lang/en_us.json @@ -31,6 +31,8 @@ "screen.extendedae_plus.title": "ExtendedAE Plus Config", "config.extendedae_plus": "ExtendedAE Plus", + "config.extendedae_plus.override_ae2wt_picking": "Override AE2WT Picking", + "extendedae_plus.configuration.general": "General", "extendedae_plus.configuration.pageMultiplier": "Pattern Provider Page Multiplier", "extendedae_plus.configuration.pageMultiplier_with_range": "Pattern Provider Page Multiplier (1-64)", diff --git a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json index 2fa9a07..45077b4 100644 --- a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json +++ b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json @@ -44,6 +44,7 @@ "screen.extendedae_plus.title": "ExtendedAE Plus 配置", "config.extendedae_plus": "ExtendedAE Plus", + "config.extendedae_plus.override_ae2wt_picking": "覆盖AE2WT选取", "extendedae_plus.configuration.general": "通用", "extendedae_plus.configuration.pageMultiplier": "扩展样板供应器槽位倍率", diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 3f9f3e1..c3c8d69 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -25,7 +25,7 @@ "ae2.menu.PatternEncodingTermMenuMixin", "ae2.menu.PatternProviderMenuAdvancedMixin", "ae2.menu.PatternProviderMenuDoublingMixin", - "ae2WTlib.ContainerUWirelessExPatternTerminalMixin", + "emi.MixinEncodePatternTransfer", "extendedae.common.PartExPatternProviderMixin", "extendedae.common.TileExPatternProviderMixin", "extendedae.container.ContainerExPatternProviderMixin", @@ -36,28 +36,25 @@ "PickFromWirelessMixin", "accessor.AbstractContainerScreenAccessor", "accessor.ScreenAccessor", - "ae2.menu.CraftConfirmMenuGoBackMixin", "ae2.accessor.AEBaseScreenAccessor", "ae2.accessor.AEBaseScreenInvoker", "ae2.accessor.MEStorageScreenAccessor", "ae2.accessor.PatternAccessTermScreenAccessor", "ae2.accessor.PatternAccessTermScreenSlotsRowAccessor", - "ae2.client.gui.InterfaceScreenMixin", "ae2.client.gui.AEBaseScreenMixin", + "ae2.client.gui.InterfaceScreenMixin", "ae2.client.gui.PatternEncodingTermScreenMixin", "ae2.client.gui.PatternProviderCloseMixin", "ae2.client.gui.PatternProviderScreenMixin", "ae2.client.gui.SlotGridLayoutMixin", + "ae2.menu.CraftConfirmMenuGoBackMixin", + "emi.MixinEncodingHelper", "extendedae.accessor.GuiExPatternTerminalAccessor", "extendedae.accessor.GuiExPatternTerminalSlotsRowAccessor", "extendedae.client.HighlightButtonMixin", "extendedae.client.gui.GuiExPatternProviderMixin", "extendedae.client.gui.GuiExPatternTerminalMixin", - "hooks.ModelBakeryMixin", - "jei.AE2JeiEncodePatternTransferHandlerMixin", - "jei.EncodePatternTransferHandlerMixin", - "jei.EncodingHelperMixin", - "jei.accessor.BookmarkOverlayAccessor" + "hooks.ModelBakeryMixin" ], "injectors": { "defaultRequire": 1