diff --git a/build.gradle b/build.gradle index 797f1e4..4b58b24 100644 --- a/build.gradle +++ b/build.gradle @@ -81,14 +81,13 @@ dependencies { //exendedae前置 modImplementation "curse.maven:glodium-957920:${glodium_version}" //extendedAE - modImplementation files('libs/ExtendedAE-1.20-1.4.2-forge.jar') - modRuntimeOnly fileTree(dir: 'libs', includes: ['*.jar']) + implementation "curse.maven:ex-pattern-provider-892005:7005572" //ae2 modImplementation "appeng:appliedenergistics2-forge:${ae2_version}" modImplementation "org.appliedenergistics:guideme:${guideme_version}" modImplementation "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}" - modImplementation "curse.maven:applied-flux-965012:6755986" + modImplementation "curse.maven:applied-flux-965012:7072853" modImplementation "curse.maven:mega-cells-622112:${mega_cells_version}" //mae2 diff --git a/src/main/java/com/extendedae_plus/content/matrix/CrafterCorePlusBlockEntity.java b/src/main/java/com/extendedae_plus/content/matrix/CrafterCorePlusBlockEntity.java index 59c2d35..d6152a1 100644 --- a/src/main/java/com/extendedae_plus/content/matrix/CrafterCorePlusBlockEntity.java +++ b/src/main/java/com/extendedae_plus/content/matrix/CrafterCorePlusBlockEntity.java @@ -4,6 +4,7 @@ import appeng.api.config.Actionable; import appeng.api.crafting.IPatternDetails; import appeng.api.inventories.InternalInventory; import appeng.api.networking.IGridNode; +import appeng.api.networking.security.IActionSource; import appeng.api.networking.storage.IStorageService; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; @@ -12,6 +13,7 @@ import appeng.api.stacks.GenericStack; import appeng.api.stacks.KeyCounter; import appeng.util.inv.CombinedInternalInventory; import com.extendedae_plus.init.ModBlockEntities; +import com.glodblock.github.extendedae.common.me.CraftingMatrixThread; import com.glodblock.github.extendedae.common.me.CraftingThread; import com.glodblock.github.extendedae.common.me.matrix.ClusterAssemblerMatrix; import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixCrafter; @@ -32,6 +34,7 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter { private final CraftingThread[] threads = new CraftingThread[MAX_THREAD]; private final InternalInventory internalInv; private final BlockEntityType overriddenType; + private short states = 0; public CrafterCorePlusBlockEntity(BlockPos pos, BlockState blockState) { super(pos, blockState); @@ -39,13 +42,35 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter { InternalInventory[] inventories = new InternalInventory[MAX_THREAD]; for (int i = 0; i < MAX_THREAD; i++) { - this.threads[i] = new CraftingThread(this); - this.threads[i].setPusher(this::pushResult); + int finalI = i; + this.threads[i] = new CraftingMatrixThread(this, this::getSrc, (signal) -> this.changeState(finalI, signal)); inventories[i] = this.threads[i].getInternalInventory(); } this.internalInv = new CombinedInternalInventory(inventories); } + private void changeState(int index, boolean state) { + boolean oldState = this.states > 0; + if (state) { + this.states |= (short)(1 << index); + } else { + this.states &= (short)(~(1 << index)); + } + + if (state) { + if (!oldState) { + this.getMainNode().ifPresent((grid, node) -> grid.getTickManager().wakeDevice(node)); + } + } else if (oldState && this.states <= 0) { + this.getMainNode().ifPresent((grid, node) -> grid.getTickManager().sleepDevice(node)); + } + + } + + private IActionSource getSrc() { + return this.cluster.getSrc(); + } + public int usedThread() { int count = 0; for (CraftingThread thread : this.threads) { @@ -144,11 +169,7 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter { thread.updateSleepiness(); isAwake |= thread.isAwake(); } - if (isAwake) { - for (CraftingThread thread : this.threads) { - thread.forceAwake(); - } - } + return new TickingRequest(1, 1, !isAwake, false); } 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 980c793..0b2bdaa 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 @@ -19,14 +19,18 @@ import com.extendedae_plus.mixin.minecraft.accessor.AbstractContainerScreenAcces import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor; import com.extendedae_plus.network.crafting.CraftingMonitorJumpC2SPacket; import com.extendedae_plus.network.crafting.CraftingMonitorOpenProviderC2SPacket; +import com.extendedae_plus.mixin.extendedae.accessor.IGuiExPatternTerminalUploadAccessor; import com.extendedae_plus.util.GuiUtil; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; +import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.minecraft.network.chat.contents.TranslatableContents; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -78,6 +82,57 @@ public abstract class AEBaseScreenMixin { } } + /** + * 在 AEBaseScreen 的 mouseClicked 入口拦截 GuiExPatternTerminal 的 Shift+左键快速上传样板功能 + */ + @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) + private void eap$exPatternTerminalShiftClick(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + // 仅处理 GuiExPatternTerminal 实例 + Object self = this; + if (!(self instanceof GuiExPatternTerminal terminal) || !(self instanceof IGuiExPatternTerminalUploadAccessor accessor)) { + return; + } + + // 检查是否是左键点击 + Shift键 + if (button != 0 || !Screen.hasShiftDown()) { + return; + } + + try { + // 获取点击的槽位(通过accessor访问hoveredSlot字段) + if (!(self instanceof AbstractContainerScreenAccessor screenAccessor)) { + return; + } + Slot hoveredSlot = screenAccessor.eap$getHoveredSlot(); + if (hoveredSlot == null || hoveredSlot.container != Minecraft.getInstance().player.getInventory()) { + return; + } + + // 点击的是玩家背包槽位 + ItemStack clickedItem = hoveredSlot.getItem(); + + // 检查是否是有效的编码样板 + if (clickedItem.isEmpty() || !PatternDetailsHelper.isEncodedPattern(clickedItem)) { + return; + } + + // 检查是否选择了样板供应器 + if (accessor.eap$getCurrentlyChoicePatternProvider() != -1) { + // 执行快速上传 + accessor.eap$quickUploadPattern(hoveredSlot.getSlotIndex()); + // 取消默认的点击行为 + cir.setReturnValue(true); + } else { + // 显示提示消息:请先选择一个样板供应器 + if (Minecraft.getInstance().player != null) { + Minecraft.getInstance().player.displayClientMessage( + Component.translatable("extendedae_plus.screen.upload.select_provider_first"), false); + } + } + } catch (Throwable ignored) { + } + } + /** * 为所有可见的样板槽位添加数量显示 */ diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/IGuiExPatternTerminalUploadAccessor.java b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/IGuiExPatternTerminalUploadAccessor.java new file mode 100644 index 0000000..af296ac --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/IGuiExPatternTerminalUploadAccessor.java @@ -0,0 +1,17 @@ +package com.extendedae_plus.mixin.extendedae.accessor; + +/** + * 用于访问 GuiExPatternTerminalMixin 中快速上传功能的接口 + */ +public interface IGuiExPatternTerminalUploadAccessor { + /** + * 获取当前选择的样板供应器ID + */ + long eap$getCurrentlyChoicePatternProvider(); + + /** + * 快速上传样板到当前选择的供应器 + */ + void eap$quickUploadPattern(int playerSlotIndex); +} + diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java index eeea63d..4c08e68 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java @@ -47,7 +47,7 @@ import static com.extendedae_plus.util.GlobalSendMessage.sendPlayerMessage; @Pseudo @SuppressWarnings({"AddedMixinMembersNamePattern"}) @Mixin(value = GuiExPatternTerminal.class) -public abstract class GuiExPatternTerminalMixin extends AEBaseScreen { +public abstract class GuiExPatternTerminalMixin extends AEBaseScreen implements com.extendedae_plus.mixin.extendedae.accessor.IGuiExPatternTerminalUploadAccessor { @Shadow(remap = false) @Final private static int GUI_PADDING_X; @Shadow(remap = false) @Final private static int GUI_PADDING_Y; @Shadow(remap = false) @Final private static int GUI_HEADER_HEIGHT; @@ -91,41 +91,28 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen } /** - * 拦截鼠标点击事件,实现Shift+左键快速上传样板功能 - * 注意:某些整合包的 ExtendedAE 版本不在该类中覆写 mouseClicked,此处设置 require=0 以防止注入失败导致崩溃。 + * 实现接口方法:获取当前选择的样板供应器ID */ - @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, require = 0) - private void onMouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - // 检查是否是左键点击 + Shift键 - if (button == 0 && hasShiftDown()) { - // 获取点击的槽位 - Slot hoveredSlot = this.getSlotUnderMouse(); - if (hoveredSlot != null && hoveredSlot.container == this.minecraft.player.getInventory()) { - // 点击的是玩家背包槽位 - ItemStack clickedItem = hoveredSlot.getItem(); - - // 检查是否是有效的编码样板 - if (!clickedItem.isEmpty() && PatternDetailsHelper.isEncodedPattern(clickedItem)) { - // 检查是否选择了样板供应器 - if (currentlyChoicePatterProvider != -1) { - // 执行快速上传 - this.eap$quickUploadPattern(hoveredSlot.getSlotIndex()); - // 取消默认的点击行为 - cir.setReturnValue(true); - } else { - // 显示提示消息:请先选择一个样板供应器 - sendPlayerMessage(Component.translatable("extendedae_plus.screen.upload.select_provider_first")); - } - } - } - } + @Override + @Unique + public long eap$getCurrentlyChoicePatternProvider() { + return this.currentlyChoicePatterProvider; } /** - * 快速上传样板到当前选择的供应器 + * 实现接口方法:快速上传样板 + */ + @Override + @Unique + public void eap$quickUploadPattern(int playerSlotIndex) { + this.eap$quickUploadPatternInternal(playerSlotIndex); + } + + /** + * 快速上传样板到当前选择的供应器(内部实现) */ @Unique - private void eap$quickUploadPattern(int playerSlotIndex) { + private void eap$quickUploadPatternInternal(int playerSlotIndex) { if (this.minecraft.player == null) return; ItemStack itemToUpload = this.minecraft.player.getInventory().getItem(playerSlotIndex); @@ -218,14 +205,6 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen this.addToLeftToolbar(this.eap$toggleSlotsButton); } - @Inject(method = "init", at = @At("TAIL"), remap = false, require = 0) - private void eap$onInit(CallbackInfo ci) { - // 清理旧的打开UI按钮并标记需要重建 - this.openUIButtons.values().forEach(this::removeWidget); - this.openUIButtons.clear(); - this.buttonsDirty = true; - } - @Inject(method = "refreshList", at = @At("HEAD"), remap = false) private void onRefreshListStart(CallbackInfo ci) { // 更新 toggle 按钮 tooltip 文本