From b3350e38e3092f30d2dc0a07811c788837572adf Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Tue, 18 Nov 2025 19:38:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=9E=E4=BD=93=E5=8A=A0=E9=80=9F?= =?UTF-8?q?=E5=99=A8=E6=B7=BB=E5=8A=A0=E7=BA=A2=E7=9F=B3=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ae/menu/EntitySpeedTickerMenu.java | 29 ++++++++-- .../ae/parts/EntitySpeedTickerPart.java | 58 ++++++++++++++++++- .../ae/screen/EntitySpeedTickerScreen.java | 35 ++++++++++- .../extendedae_plus/api/config/Settings.java | 1 + .../network/ToggleEntityTickerC2SPacket.java | 39 +++++++++---- .../assets/extendedae_plus/lang/en_us.json | 3 + .../assets/extendedae_plus/lang/zh_cn.json | 3 + 7 files changed, 148 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/extendedae_plus/ae/menu/EntitySpeedTickerMenu.java b/src/main/java/com/extendedae_plus/ae/menu/EntitySpeedTickerMenu.java index 8bd8ae5..3f368f8 100644 --- a/src/main/java/com/extendedae_plus/ae/menu/EntitySpeedTickerMenu.java +++ b/src/main/java/com/extendedae_plus/ae/menu/EntitySpeedTickerMenu.java @@ -21,12 +21,13 @@ import net.minecraftforge.registries.ForgeRegistries; */ public class EntitySpeedTickerMenu extends UpgradeableMenu { @GuiSync(716) public boolean accelerateEnabled = true; // 是否启用加速 - @GuiSync(717) public int entitySpeedCardCount; // 已安装的实体加速卡数量 - @GuiSync(718) public int energyCardCount; // 已安装的能量卡数量 - @GuiSync(719) public int effectiveSpeed = 1; // 当前生效的加速倍率 - @GuiSync(720) public double multiplier = 1.0; // 目标方块的配置倍率 - @GuiSync(721) public boolean targetBlacklisted = false; // 目标方块是否在黑名单中 - @GuiSync(722) public boolean networkEnergySufficient = true; // 网络能量是否充足 + @GuiSync(717) public boolean redstoneControlEnabled = false; // 是否启用红石控制 + @GuiSync(718) public int entitySpeedCardCount; // 已安装的实体加速卡数量 + @GuiSync(719) public int energyCardCount; // 已安装的能量卡数量 + @GuiSync(720) public int effectiveSpeed = 1; // 当前生效的加速倍率 + @GuiSync(721) public double multiplier = 1.0; // 目标方块的配置倍率 + @GuiSync(722) public boolean targetBlacklisted = false; // 目标方块是否在黑名单中 + @GuiSync(723) public boolean networkEnergySufficient = true; // 网络能量是否充足 /** * 构造函数,初始化菜单并绑定部件。 @@ -39,6 +40,7 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu extends UpgradeableScreen { private boolean eap$entitySpeedTickerEnabled = false; // 本地缓存的加速开关状态 + private boolean eap$redstoneControlEnabled = false; // 本地缓存的红石控制状态 private final SettingToggleButton eap$entitySpeedTickerToggle; // 加速开关按钮 + private final SettingToggleButton eap$redstoneControlToggle; // 红石控制开关按钮 /** * 构造函数,初始化界面和控件。 @@ -37,13 +39,14 @@ public class EntitySpeedTickerScreen extends Up super((C) menu, playerInventory, title, style); this.addToLeftToolbar(CommonButtons.togglePowerUnit()); // 添加功率单位切换按钮 this.eap$entitySpeedTickerEnabled = menu.getAccelerateEnabled(); + this.eap$redstoneControlEnabled = menu.getRedstoneControlEnabled(); // 初始化加速开关按钮 eap$entitySpeedTickerToggle = new SettingToggleButton<>( Settings.BLOCKING_MODE, this.eap$entitySpeedTickerEnabled ? YesNo.YES : YesNo.NO, (btn, backwards) -> - ModNetwork.CHANNEL.sendToServer(new ToggleEntityTickerC2SPacket()) + ModNetwork.CHANNEL.sendToServer(new ToggleEntityTickerC2SPacket(ToggleEntityTickerC2SPacket.Setting.accelerateEnabled)) ) { @Override public List getTooltipMessage() { @@ -69,6 +72,30 @@ public class EntitySpeedTickerScreen extends Up }; eap$entitySpeedTickerToggle.set(this.eap$entitySpeedTickerEnabled ? YesNo.YES : YesNo.NO); this.addToLeftToolbar(eap$entitySpeedTickerToggle); + + // 初始化加速开关按钮 + eap$redstoneControlToggle = new SettingToggleButton<>( + Settings.BLOCKING_MODE, + this.eap$redstoneControlEnabled ? YesNo.YES : YesNo.NO, + (btn, backwards) -> + ModNetwork.CHANNEL.sendToServer(new ToggleEntityTickerC2SPacket(ToggleEntityTickerC2SPacket.Setting.redstoneControlEnabled)) + ) { + @Override + public List getTooltipMessage() { + boolean enabled = eap$redstoneControlEnabled; + return List.of( + Component.translatable("extendedae_plus.gui.redstone_control.title"), + enabled ? Component.translatable("extendedae_plus.gui.redstone_control.enabled") : + Component.translatable("extendedae_plus.gui.redstone_control.disabled") ); + } + + @Override + protected Icon getIcon() { + return this.getCurrentValue() == YesNo.YES ? Icon.REDSTONE_LOW : Icon.REDSTONE_IGNORE; + } + }; + eap$redstoneControlToggle.set(this.eap$redstoneControlEnabled ? YesNo.YES : YesNo.NO); + this.addToLeftToolbar(eap$redstoneControlToggle); } /** @@ -83,6 +110,12 @@ public class EntitySpeedTickerScreen extends Up eap$entitySpeedTickerToggle.set(menu.targetBlacklisted ? YesNo.NO : (eap$entitySpeedTickerEnabled ? YesNo.YES : YesNo.NO)); eap$entitySpeedTickerToggle.active = !menu.targetBlacklisted; } + + if (eap$redstoneControlToggle != null && menu != null) { + eap$redstoneControlEnabled = menu.getRedstoneControlEnabled(); + eap$redstoneControlToggle.set(eap$redstoneControlEnabled ? YesNo.YES : YesNo.NO); + } + textData(); } diff --git a/src/main/java/com/extendedae_plus/api/config/Settings.java b/src/main/java/com/extendedae_plus/api/config/Settings.java index 66c347b..aeb6333 100644 --- a/src/main/java/com/extendedae_plus/api/config/Settings.java +++ b/src/main/java/com/extendedae_plus/api/config/Settings.java @@ -11,6 +11,7 @@ import java.util.Map; public final class Settings { private static final Map> SETTINGS = new HashMap<>(); public static final Setting ACCELERATE = register("accelerate", YesNo.NO, YesNo.YES); + public static final Setting REDSTONE_CONTROL = register("redstoneControl", YesNo.NO, YesNo.YES); private Settings() { diff --git a/src/main/java/com/extendedae_plus/network/ToggleEntityTickerC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleEntityTickerC2SPacket.java index 0e4163d..0b6e3f6 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleEntityTickerC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleEntityTickerC2SPacket.java @@ -9,37 +9,56 @@ import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; /** - * C2S: Toggle the accelerateEnabled flag on the EntitySpeedTickerPart bound to the open menu. + * C2S: 切换 EntitySpeedTickerPart 的某个布尔配置项 */ public class ToggleEntityTickerC2SPacket { - public ToggleEntityTickerC2SPacket() { + + private final Setting setting; + + public ToggleEntityTickerC2SPacket(Setting setting) { + this.setting = setting; } public static void encode(ToggleEntityTickerC2SPacket msg, FriendlyByteBuf buf) { + buf.writeEnum(msg.setting); } public static ToggleEntityTickerC2SPacket decode(FriendlyByteBuf buf) { - return new ToggleEntityTickerC2SPacket(); + return new ToggleEntityTickerC2SPacket(buf.readEnum(Setting.class)); } public static void handle(ToggleEntityTickerC2SPacket msg, Supplier ctxSupplier) { - var ctx = ctxSupplier.get(); + NetworkEvent.Context ctx = ctxSupplier.get(); ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); if (player == null) return; + if (!(player.containerMenu instanceof EntitySpeedTickerMenu menu)) return; EntitySpeedTickerPart part = menu.getHost(); if (part == null) return; - // 切换部件上的状态,并把新状态同步到菜单字段,随后广播以通知客户端 - boolean current = part.getAccelerateEnabled(); - boolean next = !current; - part.setAccelerateEnabled(next); - // 确保菜单上的字段也被更新,这样 @GuiSync 会把状态发回客户端 - menu.setAccelerateEnabled(next); + switch (msg.setting) { + case accelerateEnabled -> { + boolean newValue = !part.getAccelerateEnabled(); + part.setAccelerateEnabled(newValue); + menu.setAccelerateEnabled(newValue); + } + case redstoneControlEnabled -> { + boolean newValue = !part.getRedstoneControlEnabled(); + part.setRedstoneControlEnabled(newValue); + menu.setRedstoneControlEnabled(newValue); + } + } + + // 统一广播,让所有打开界面的客户端同步最新状态 menu.broadcastChanges(); }); ctx.setPacketHandled(true); } + + public enum Setting { + accelerateEnabled, + redstoneControlEnabled + } } \ No newline at end of file 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 4ffe9fe..fc948bb 100644 --- a/src/main/resources/assets/extendedae_plus/lang/en_us.json +++ b/src/main/resources/assets/extendedae_plus/lang/en_us.json @@ -89,6 +89,9 @@ "extendedae_plus.gui.entity_acceleration.blacklisted": "Target is blacklisted", "extendedae_plus.gui.entity_acceleration.enabled": "Accelerate target block entity ticks", "extendedae_plus.gui.entity_acceleration.disabled": "Do not accelerate target block entities", + "extendedae_plus.gui.redstone_control.title": "Redstone Control", + "extendedae_plus.gui.redstone_control.enabled": "Control acceleration with redstone signal", + "extendedae_plus.gui.redstone_control.disabled": "Ignore redstone signals", "extendedae_plus.screen.reload_mapping": "Reload Mapping", "extendedae_plus.screen.reload_mapping_success": "Overloading mapping successful", 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 229c609..f770b2a 100644 --- a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json +++ b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json @@ -89,6 +89,9 @@ "extendedae_plus.gui.entity_acceleration.blacklisted": "目标在黑名单中", "extendedae_plus.gui.entity_acceleration.enabled": "加速目标方块实体的tick", "extendedae_plus.gui.entity_acceleration.disabled": "不加速目标方块实体", + "extendedae_plus.gui.redstone_control.title": "红石控制", + "extendedae_plus.gui.redstone_control.enabled": "使用红石信号控制加速", + "extendedae_plus.gui.redstone_control.disabled": "忽略红石信号", "extendedae_plus.screen.reload_mapping": "重载映射", "extendedae_plus.screen.reload_mapping_success": "重载映射成功", From 8941eab3dcb2098f7db3eedf26015171dad5bbb4 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Sat, 22 Nov 2025 00:37:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E4=B8=AD=E9=94=AE=E9=80=89?= =?UTF-8?q?=E5=8F=96=E5=90=8Eae=E4=B8=AD=E6=B2=A1=E6=9C=89=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E4=B8=94=E5=8F=AF=E5=90=88=E6=88=90=E5=88=99=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E5=88=B0=E4=B8=8B=E5=8D=95=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/PickFromWirelessC2SPacket.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extendedae_plus/network/PickFromWirelessC2SPacket.java b/src/main/java/com/extendedae_plus/network/PickFromWirelessC2SPacket.java index 54798f8..0caaa3f 100644 --- a/src/main/java/com/extendedae_plus/network/PickFromWirelessC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/PickFromWirelessC2SPacket.java @@ -8,6 +8,9 @@ import appeng.api.storage.StorageHelper; import appeng.items.tools.powered.WirelessCraftingTerminalItem; import appeng.items.tools.powered.WirelessTerminalItem; import appeng.me.helpers.PlayerSource; +import appeng.menu.locator.MenuLocators; +import appeng.menu.me.crafting.CraftAmountMenu; +import com.extendedae_plus.menu.locator.CuriosItemLocator; import com.extendedae_plus.util.wireless.WirelessTerminalLocator; import com.extendedae_plus.util.wireless.WirelessTerminalLocator.LocatedTerminal; import de.mari_023.ae2wtlib.terminal.WTMenuHost; @@ -165,8 +168,32 @@ public class PickFromWirelessC2SPacket { } long extracted = StorageHelper.poweredExtraction(energy, storage, targetKey, space, new PlayerSource(player)); - if (extracted <= 0) { - return; + // 1. 网络里为 0 + // 2. 主手当前是空的 OR 主手拿的不是这个物品 + // 3. 这个物品可以被 AE2 合成 + if (extracted == 0) { + ItemStack mainHandItem = player.getMainHandItem(); + boolean handIsEmpty = mainHandItem.isEmpty(); + boolean handIsDifferentItem = !handIsEmpty && !AEItemKey.of(mainHandItem).equals(targetKey); + + if (handIsEmpty || handIsDifferentItem) { + var craftingService = grid.getCraftingService(); + if (craftingService.isCraftable(targetKey)) { + // 主手为空一组 + if (curiosSlotId != null && curiosIndex >= 0) { + CraftAmountMenu.open(player, new CuriosItemLocator(curiosSlotId, curiosIndex), targetKey, 64); + } else { + var hand = located.getHand(); + int slot = located.getSlotIndex(); + if (hand != null) { + CraftAmountMenu.open(player, MenuLocators.forHand(player, hand), targetKey, 64); + } else if (slot >= 0) { + CraftAmountMenu.open(player, MenuLocators.forInventorySlot(slot), targetKey, 64); + } + } + return; // 打开界面后直接结束,不执行后面的放物品逻辑 + } + } } if (placeToMainHand) {