Merge remote-tracking branch 'origin/1.21.1' into 1.21.1

# Conflicts:
#	build/generated/sources/modMetadata/META-INF/neoforge.mods.toml
#	src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java
#	src/main/resources/assets/extendedae_plus/lang/en_us.json
#	src/main/resources/assets/extendedae_plus/lang/zh_cn.json
This commit is contained in:
GaLicn 2025-11-29 12:52:07 +08:00
commit 31f43cc34a
9 changed files with 119 additions and 3 deletions

View File

@ -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. # The authors of the mod. This is a simple text string that is used for display purposes in the mod list.
mod_authors=GaLi 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. # 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) ## 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 # Default to 'emi' per request; you can override by running with -Puse_Xei=rei or -Puse_Xei=jei

View File

@ -0,0 +1,13 @@
package com.extendedae_plus.api.upload;
public interface IPatternEncodingShiftUploadSync {
/**
* 由客户端发送的编码指令附带的 Shift 状态
*/
void eap$clientSetShiftUpload(boolean shiftDown);
/**
* 服务器在处理 encode() 时消费该标记并在读取后自动复位
*/
boolean eap$consumeShiftUploadFlag();
}

View File

@ -3,6 +3,7 @@ package com.extendedae_plus.init;
import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.network.*; import com.extendedae_plus.network.*;
import com.extendedae_plus.network.packet.EAPConfigButtonPacket; import com.extendedae_plus.network.packet.EAPConfigButtonPacket;
import com.extendedae_plus.network.upload.EncodeWithShiftFlagC2SPacket;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
public class ModNetwork { public class ModNetwork {
@ -21,6 +22,7 @@ public class ModNetwork {
registrar.playToServer(OpenProviderUiC2SPacket.TYPE, OpenProviderUiC2SPacket.STREAM_CODEC, OpenProviderUiC2SPacket::handle); registrar.playToServer(OpenProviderUiC2SPacket.TYPE, OpenProviderUiC2SPacket.STREAM_CODEC, OpenProviderUiC2SPacket::handle);
registrar.playToServer(UploadEncodedPatternToProviderC2SPacket.TYPE, UploadEncodedPatternToProviderC2SPacket.STREAM_CODEC, UploadEncodedPatternToProviderC2SPacket::handle); registrar.playToServer(UploadEncodedPatternToProviderC2SPacket.TYPE, UploadEncodedPatternToProviderC2SPacket.STREAM_CODEC, UploadEncodedPatternToProviderC2SPacket::handle);
registrar.playToServer(UploadInventoryPatternToProviderC2SPacket.TYPE, UploadInventoryPatternToProviderC2SPacket.STREAM_CODEC, UploadInventoryPatternToProviderC2SPacket::handle); registrar.playToServer(UploadInventoryPatternToProviderC2SPacket.TYPE, UploadInventoryPatternToProviderC2SPacket.STREAM_CODEC, UploadInventoryPatternToProviderC2SPacket::handle);
registrar.playToServer(EncodeWithShiftFlagC2SPacket.TYPE, EncodeWithShiftFlagC2SPacket.STREAM_CODEC, EncodeWithShiftFlagC2SPacket::handle);
// 新增JEI 中键打开合成界面 & 无线终端拾取方块物品 // 新增JEI 中键打开合成界面 & 无线终端拾取方块物品
registrar.playToServer(com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.TYPE, registrar.playToServer(com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.TYPE,
com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.STREAM_CODEC, com.extendedae_plus.network.OpenCraftFromJeiC2SPacket.STREAM_CODEC,

View File

@ -5,6 +5,7 @@ import appeng.client.gui.Icon;
import appeng.client.gui.me.items.PatternEncodingTermScreen; import appeng.client.gui.me.items.PatternEncodingTermScreen;
import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.ScreenStyle;
import appeng.client.gui.style.WidgetStyle; import appeng.client.gui.style.WidgetStyle;
import appeng.client.gui.widgets.ActionButton;
import appeng.client.gui.widgets.IconButton; import appeng.client.gui.widgets.IconButton;
import appeng.menu.AEBaseMenu; import appeng.menu.AEBaseMenu;
import com.extendedae_plus.mixin.accessor.AbstractContainerScreenAccessor; 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.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/** /**

View File

@ -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 = "<init>", 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();
});
}
}

View File

@ -4,6 +4,7 @@ import appeng.api.crafting.PatternDetailsHelper;
import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.menu.slot.RestrictedInputSlot; import appeng.menu.slot.RestrictedInputSlot;
import appeng.parts.encoding.EncodingMode; import appeng.parts.encoding.EncodingMode;
import com.extendedae_plus.api.upload.IPatternEncodingShiftUploadSync;
import com.extendedae_plus.util.uploadPattern.ExtendedAEPatternUploadUtil; import com.extendedae_plus.util.uploadPattern.ExtendedAEPatternUploadUtil;
import com.glodblock.github.glodium.network.packet.sync.ActionMap; import com.glodblock.github.glodium.network.packet.sync.ActionMap;
import com.glodblock.github.glodium.network.packet.sync.IActionHolder; 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 装配矩阵 * 注册动作 "upload_to_matrix"仅上传合成图样 ExtendedAE 装配矩阵
*/ */
@Mixin(PatternEncodingTermMenu.class) @Mixin(PatternEncodingTermMenu.class)
public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder { public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder, IPatternEncodingShiftUploadSync {
@Unique @Unique
private final ActionMap eap$actions = ActionMap.create(); private final ActionMap eap$actions = ActionMap.create();
@ -34,9 +35,26 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
@Unique @Unique
private Player epp$player; private Player epp$player;
@Unique
private boolean eap$pendingShiftUpload;
@Shadow(remap = false) @Shadow(remap = false)
private RestrictedInputSlot encodedPatternSlot; 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 @Unique
private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) { private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
sp.server.execute(() -> { sp.server.execute(() -> {
@ -85,6 +103,9 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
if (!(this.epp$player instanceof ServerPlayer sp)) { if (!(this.epp$player instanceof ServerPlayer sp)) {
return; // 仅服务器执行 return; // 仅服务器执行
} }
if (!this.eap$consumeShiftUploadFlag()) {
return; // 未按下 Shift不自动上传
}
var menu = (PatternEncodingTermMenu) (Object) this; var menu = (PatternEncodingTermMenu) (Object) this;
if (menu.getMode() != EncodingMode.CRAFTING if (menu.getMode() != EncodingMode.CRAFTING
&& menu.getMode() != EncodingMode.SMITHING_TABLE && menu.getMode() != EncodingMode.SMITHING_TABLE

View File

@ -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<EncodeWithShiftFlagC2SPacket> TYPE = new Type<>(
ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "encode_with_shift"));
public static final StreamCodec<FriendlyByteBuf, EncodeWithShiftFlagC2SPacket> 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<? extends CustomPacketPayload> type() {
return TYPE;
}
}

View File

@ -73,6 +73,7 @@
"ae2.client.gui.AEBaseScreenMixin", "ae2.client.gui.AEBaseScreenMixin",
"ae2.client.gui.InterfaceScreenMixin", "ae2.client.gui.InterfaceScreenMixin",
"ae2.client.gui.PatternEncodingTermScreenMixin", "ae2.client.gui.PatternEncodingTermScreenMixin",
"ae2.client.gui.PatternEncodingTermUploadMixin",
"ae2.client.gui.PatternProviderCloseMixin", "ae2.client.gui.PatternProviderCloseMixin",
"ae2.client.gui.PatternProviderScreenUpgradesMixin", "ae2.client.gui.PatternProviderScreenUpgradesMixin",
"ae2.client.gui.PatternProviderSmartFeaturesMixin", "ae2.client.gui.PatternProviderSmartFeaturesMixin",

View File

@ -33,7 +33,7 @@ displayURL = "https://github.com/GaLicn/ExtendedAE_Plus"
logoFile="logo.png" logoFile="logo.png"
# A text field displayed in the mod UI # A text field displayed in the mod UI
#credits="" #optional credits="C-H716"
# A text field displayed in the mod UI # A text field displayed in the mod UI
authors = "${mod_authors}" #optional authors = "${mod_authors}" #optional