diff --git a/gradle.properties b/gradle.properties index 4e959f1..b75ac42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ 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=GaLi # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Add more practical features and auxiliary operations to the Applied Energistics 2 mod. \nSpecial thanks to contributor C-H716. +mod_description=Add more practical features and auxiliary operations to the Applied Energistics 2 mod. ## 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 diff --git a/src/main/java/com/extendedae_plus/api/upload/IPatternEncodingShiftUploadSync.java b/src/main/java/com/extendedae_plus/api/upload/IPatternEncodingShiftUploadSync.java new file mode 100644 index 0000000..a11d784 --- /dev/null +++ b/src/main/java/com/extendedae_plus/api/upload/IPatternEncodingShiftUploadSync.java @@ -0,0 +1,13 @@ +package com.extendedae_plus.api.upload; + +public interface IPatternEncodingShiftUploadSync { + /** + * 由客户端发送的编码指令附带的 Shift 状态。 + */ + void eap$clientSetShiftUpload(boolean shiftDown); + + /** + * 服务器在处理 encode() 时消费该标记,并在读取后自动复位。 + */ + boolean eap$consumeShiftUploadFlag(); +} diff --git a/src/main/java/com/extendedae_plus/init/ModNetwork.java b/src/main/java/com/extendedae_plus/init/ModNetwork.java index a3523a7..913f6be 100644 --- a/src/main/java/com/extendedae_plus/init/ModNetwork.java +++ b/src/main/java/com/extendedae_plus/init/ModNetwork.java @@ -3,6 +3,7 @@ package com.extendedae_plus.init; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.network.*; import com.extendedae_plus.network.packet.EAPConfigButtonPacket; +import com.extendedae_plus.network.upload.EncodeWithShiftFlagC2SPacket; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; public class ModNetwork { @@ -21,6 +22,7 @@ public class ModNetwork { registrar.playToServer(OpenProviderUiC2SPacket.TYPE, OpenProviderUiC2SPacket.STREAM_CODEC, OpenProviderUiC2SPacket::handle); registrar.playToServer(UploadEncodedPatternToProviderC2SPacket.TYPE, UploadEncodedPatternToProviderC2SPacket.STREAM_CODEC, UploadEncodedPatternToProviderC2SPacket::handle); registrar.playToServer(UploadInventoryPatternToProviderC2SPacket.TYPE, UploadInventoryPatternToProviderC2SPacket.STREAM_CODEC, UploadInventoryPatternToProviderC2SPacket::handle); + registrar.playToServer(EncodeWithShiftFlagC2SPacket.TYPE, EncodeWithShiftFlagC2SPacket.STREAM_CODEC, EncodeWithShiftFlagC2SPacket::handle); // 新增:JEI 中键打开合成界面 & 无线终端拾取方块物品 registrar.playToServer(com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.TYPE, com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.STREAM_CODEC, 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..62a694c 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 @@ -5,6 +5,7 @@ import appeng.client.gui.Icon; import appeng.client.gui.me.items.PatternEncodingTermScreen; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.WidgetStyle; +import appeng.client.gui.widgets.ActionButton; import appeng.client.gui.widgets.IconButton; import appeng.menu.AEBaseMenu; import com.extendedae_plus.mixin.accessor.AbstractContainerScreenAccessor; @@ -20,6 +21,8 @@ import org.spongepowered.asm.mixin.Mixin; 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.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermUploadMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermUploadMixin.java new file mode 100644 index 0000000..db8e273 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternEncodingTermUploadMixin.java @@ -0,0 +1,24 @@ +package com.extendedae_plus.mixin.ae2.client.gui; + +import appeng.api.config.ActionItems; +import appeng.client.gui.me.items.PatternEncodingTermScreen; +import appeng.client.gui.widgets.ActionButton; +import com.extendedae_plus.init.ModNetwork; +import com.extendedae_plus.network.upload.EncodeWithShiftFlagC2SPacket; +import net.minecraft.client.gui.screens.Screen; +import net.neoforged.neoforge.network.PacketDistributor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(PatternEncodingTermScreen.class) +public class PatternEncodingTermUploadMixin { + @ModifyVariable(method = "", at = @At(value = "STORE"), name = "encodeBtn") + private ActionButton eap$encodingButton(ActionButton button) { + return new ActionButton(ActionItems.ENCODE,actionItems -> { + PacketDistributor.sendToServer(new EncodeWithShiftFlagC2SPacket(Screen.hasShiftDown())); + var screen=(PatternEncodingTermScreen) (Object)this; + screen.getMenu().encode(); + }); + } +} 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 be8aac0..d5821f0 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 @@ -4,6 +4,7 @@ import appeng.api.crafting.PatternDetailsHelper; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; import appeng.parts.encoding.EncodingMode; +import com.extendedae_plus.api.upload.IPatternEncodingShiftUploadSync; import com.extendedae_plus.util.uploadPattern.ExtendedAEPatternUploadUtil; import com.glodblock.github.glodium.network.packet.sync.ActionMap; import com.glodblock.github.glodium.network.packet.sync.IActionHolder; @@ -26,7 +27,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; * 注册动作 "upload_to_matrix":仅上传“合成图样”到 ExtendedAE 装配矩阵。 */ @Mixin(PatternEncodingTermMenu.class) -public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder { +public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder, IPatternEncodingShiftUploadSync { @Unique private final ActionMap eap$actions = ActionMap.create(); @@ -34,9 +35,26 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo @Unique private Player epp$player; + @Unique + private boolean eap$pendingShiftUpload; + @Shadow(remap = false) private RestrictedInputSlot encodedPatternSlot; + @Unique + @Override + public void eap$clientSetShiftUpload(boolean shiftDown) { + this.eap$pendingShiftUpload = shiftDown; + } + + @Unique + @Override + public boolean eap$consumeShiftUploadFlag() { + boolean flag = this.eap$pendingShiftUpload; + this.eap$pendingShiftUpload = false; + return flag; + } + @Unique private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) { sp.server.execute(() -> { @@ -85,6 +103,9 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo if (!(this.epp$player instanceof ServerPlayer sp)) { return; // 仅服务器执行 } + if (!this.eap$consumeShiftUploadFlag()) { + return; // 未按下 Shift,不自动上传 + } var menu = (PatternEncodingTermMenu) (Object) this; if (menu.getMode() != EncodingMode.CRAFTING && menu.getMode() != EncodingMode.SMITHING_TABLE diff --git a/src/main/java/com/extendedae_plus/network/upload/EncodeWithShiftFlagC2SPacket.java b/src/main/java/com/extendedae_plus/network/upload/EncodeWithShiftFlagC2SPacket.java new file mode 100644 index 0000000..7c0b48e --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/upload/EncodeWithShiftFlagC2SPacket.java @@ -0,0 +1,52 @@ +package com.extendedae_plus.network.upload; + +import appeng.menu.me.items.PatternEncodingTermMenu; +import com.extendedae_plus.ExtendedAEPlus; +import com.extendedae_plus.api.upload.IPatternEncodingShiftUploadSync; +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.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +/** + * C2S:图样编码终端点击「编码」按钮时同步客户端的 Shift 状态。 + */ +public class EncodeWithShiftFlagC2SPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "encode_with_shift")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + (buf, pkt) -> buf.writeBoolean(pkt.shiftDown), + buf -> new EncodeWithShiftFlagC2SPacket(buf.readBoolean()) + ); + + private final boolean shiftDown; + + public EncodeWithShiftFlagC2SPacket(boolean shiftDown) { + this.shiftDown = shiftDown; + } + + public boolean shiftDown() { + return shiftDown; + } + + public static void handle(final EncodeWithShiftFlagC2SPacket msg, final IPayloadContext ctx) { + ctx.enqueueWork(() -> { + if (!(ctx.player() instanceof ServerPlayer player)) { + return; + } + if (player.containerMenu instanceof PatternEncodingTermMenu menu + && menu instanceof IPatternEncodingShiftUploadSync sync) { + sync.eap$clientSetShiftUpload(msg.shiftDown()); + } + }); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 11de5c0..c6c43e8 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -73,6 +73,7 @@ "ae2.client.gui.AEBaseScreenMixin", "ae2.client.gui.InterfaceScreenMixin", "ae2.client.gui.PatternEncodingTermScreenMixin", + "ae2.client.gui.PatternEncodingTermUploadMixin", "ae2.client.gui.PatternProviderCloseMixin", "ae2.client.gui.PatternProviderScreenUpgradesMixin", "ae2.client.gui.PatternProviderSmartFeaturesMixin", diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index 7adf428..d6a0eeb 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -33,7 +33,7 @@ displayURL = "https://github.com/GaLicn/ExtendedAE_Plus" logoFile="logo.png" # A text field displayed in the mod UI -#credits="" #optional +credits="C-H716" # A text field displayed in the mod UI authors = "${mod_authors}" #optional