From 1589f179cdc6d39f2d4f72ddf1810179a380ca4c Mon Sep 17 00:00:00 2001 From: GaLicn <133291877+GaLicn@users.noreply.github.com> Date: Mon, 22 Sep 2025 19:01:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E6=96=B9?= =?UTF-8?q?=E5=9D=97=E6=8F=92=E5=85=A5=E9=A2=91=E9=81=93=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extendedae_plus/init/UpgradeCards.java | 33 ++++++++++ .../automation/IOBusPartChannelCardMixin.java | 65 +++++++++++++++++++ .../IOBusPartTickerChannelCardMixin.java | 24 +++++++ .../StorageBusPartChannelCardMixin.java | 63 ++++++++++++++++++ .../StorageBusPartTickerChannelCardMixin.java | 24 +++++++ .../resources/extendedae_plus.mixins.json | 4 ++ 6 files changed, 213 insertions(+) create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartChannelCardMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartTickerChannelCardMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartTickerChannelCardMixin.java diff --git a/src/main/java/com/extendedae_plus/init/UpgradeCards.java b/src/main/java/com/extendedae_plus/init/UpgradeCards.java index 05dec0d..d3a0089 100644 --- a/src/main/java/com/extendedae_plus/init/UpgradeCards.java +++ b/src/main/java/com/extendedae_plus/init/UpgradeCards.java @@ -6,6 +6,14 @@ import appeng.core.definitions.AEItems; import appeng.core.definitions.AEParts; import appeng.core.localization.GuiText; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_PATTERN_PROVIDER; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_PATTERN_PROVIDER_PART; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_INTERFACE; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_INTERFACE_PART; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.OVERSIZE_INTERFACE; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.OVERSIZE_INTERFACE_PART; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_IMPORT_BUS; +import static com.glodblock.github.extendedae.common.EPPItemAndBlock.EX_EXPORT_BUS; /** * @@ -22,6 +30,31 @@ public class UpgradeCards { String interfaceGroup = GuiText.Interface.getTranslationKey(); Upgrades.add(ModItems.CHANNEL_CARD.get(), AEBlocks.INTERFACE, 1, interfaceGroup); Upgrades.add(ModItems.CHANNEL_CARD.get(), AEParts.INTERFACE, 1, interfaceGroup); + + // 新增:样板供应器(方块与部件)支持频道卡,每台最多 1 张 + String patternProviderGroup = "group.pattern_provider.name"; + Upgrades.add(ModItems.CHANNEL_CARD.get(), AEBlocks.PATTERN_PROVIDER, 1, patternProviderGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), AEParts.PATTERN_PROVIDER, 1, patternProviderGroup); + + // ExtendedAE 的扩展样板供应器(方块与部件) + Upgrades.add(ModItems.CHANNEL_CARD.get(),EX_PATTERN_PROVIDER, 1, patternProviderGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(),EX_PATTERN_PROVIDER_PART, 1, patternProviderGroup); + + //EAE 的扩展接口与超大接口(方块与部件)支持频道卡 + Upgrades.add(ModItems.CHANNEL_CARD.get(), EX_INTERFACE, 1, interfaceGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), EX_INTERFACE_PART, 1, interfaceGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), OVERSIZE_INTERFACE, 1, interfaceGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), OVERSIZE_INTERFACE_PART, 1, interfaceGroup); + + //AE2 的输入/输出/存储总线支持频道卡(部件) + String ioBusGroup = GuiText.IOBuses.getTranslationKey(); + Upgrades.add(ModItems.CHANNEL_CARD.get(), AEParts.IMPORT_BUS, 1, ioBusGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), AEParts.EXPORT_BUS, 1, ioBusGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), AEParts.STORAGE_BUS, 1, ioBusGroup); + + //EAE 的扩展输入/输出总线支持频道卡(部件) + Upgrades.add(ModItems.CHANNEL_CARD.get(), EX_IMPORT_BUS, 1, ioBusGroup); + Upgrades.add(ModItems.CHANNEL_CARD.get(), EX_EXPORT_BUS, 1, ioBusGroup); }); } } \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartChannelCardMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartChannelCardMixin.java new file mode 100644 index 0000000..c556c8f --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartChannelCardMixin.java @@ -0,0 +1,65 @@ +package com.extendedae_plus.mixin.ae2.parts.automation; + +import appeng.api.networking.security.IActionHost; +import appeng.api.upgrades.IUpgradeInventory; +import appeng.api.upgrades.IUpgradeableObject; +import appeng.helpers.InterfaceLogicHost; +import appeng.parts.automation.IOBusPart; +import com.extendedae_plus.ae.items.ChannelCardItem; +import com.extendedae_plus.bridge.InterfaceWirelessLinkBridge; +import com.extendedae_plus.init.ModItems; +import com.extendedae_plus.wireless.WirelessSlaveLink; +import com.extendedae_plus.wireless.endpoint.GenericNodeEndpointImpl; +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.callback.CallbackInfo; + +/** + * 给 AE2 的 I/O 总线注入频道卡联动:在升级变更时读取频道并更新无线链接。 + */ +@Mixin(value = IOBusPart.class, remap = false) +public abstract class IOBusPartChannelCardMixin implements InterfaceWirelessLinkBridge, IUpgradeableObject { + + @Unique + private WirelessSlaveLink extendedae_plus$link; + + @Inject(method = "upgradesChanged", at = @At("TAIL")) + private void extendedae_plus$onUpgradesChanged(CallbackInfo ci) { + IUpgradeInventory inv = this.getUpgrades(); + long channel = 0L; + boolean found = false; + for (var stack : inv) { + if (!stack.isEmpty() && stack.getItem() == ModItems.CHANNEL_CARD.get()) { + channel = ChannelCardItem.getChannel(stack); + found = true; + break; + } + } + if (!found) { + // 无频道卡则断开 + if (extendedae_plus$link != null) { + extendedae_plus$link.setFrequency(0L); + extendedae_plus$link.updateStatus(); + } + return; + } + if (extendedae_plus$link == null) { + var endpoint = new GenericNodeEndpointImpl( + () -> ((appeng.parts.AEBasePart)(Object)this).getHost().getBlockEntity(), + () -> ((IActionHost)(Object)this).getActionableNode() + ); + extendedae_plus$link = new WirelessSlaveLink(endpoint); + } + extendedae_plus$link.setFrequency(channel); + extendedae_plus$link.updateStatus(); + } + + @Override + public void extendedae_plus$updateWirelessLink() { + if (extendedae_plus$link != null) { + extendedae_plus$link.updateStatus(); + } + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartTickerChannelCardMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartTickerChannelCardMixin.java new file mode 100644 index 0000000..c5bd28f --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/parts/automation/IOBusPartTickerChannelCardMixin.java @@ -0,0 +1,24 @@ +package com.extendedae_plus.mixin.ae2.parts.automation; + +import appeng.api.networking.IGridNode; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.parts.automation.IOBusPart; +import com.extendedae_plus.bridge.InterfaceWirelessLinkBridge; +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; + +/** + * 在 I/O 总线的 tickingRequest 尾部驱动无线链接刷新。 + */ +@Mixin(value = IOBusPart.class, remap = false) +public abstract class IOBusPartTickerChannelCardMixin { + + @Inject(method = "tickingRequest", at = @At("TAIL")) + private void extendedae_plus$tickTail(IGridNode node, int ticksSinceLastCall, CallbackInfoReturnable cir) { + if (this instanceof InterfaceWirelessLinkBridge bridge) { + bridge.extendedae_plus$updateWirelessLink(); + } + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java new file mode 100644 index 0000000..2abb221 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java @@ -0,0 +1,63 @@ +package com.extendedae_plus.mixin.ae2.parts.storagebus; + +import appeng.api.networking.security.IActionHost; +import appeng.api.upgrades.IUpgradeInventory; +import appeng.api.upgrades.IUpgradeableObject; +import appeng.parts.storagebus.StorageBusPart; +import com.extendedae_plus.ae.items.ChannelCardItem; +import com.extendedae_plus.bridge.InterfaceWirelessLinkBridge; +import com.extendedae_plus.init.ModItems; +import com.extendedae_plus.wireless.WirelessSlaveLink; +import com.extendedae_plus.wireless.endpoint.GenericNodeEndpointImpl; +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.callback.CallbackInfo; + +/** + * 给 AE2 的存储总线注入频道卡联动:在升级变更时读取频道并更新无线链接。 + */ +@Mixin(value = StorageBusPart.class, remap = false) +public abstract class StorageBusPartChannelCardMixin implements InterfaceWirelessLinkBridge, IUpgradeableObject { + + @Unique + private WirelessSlaveLink extendedae_plus$link; + + @Inject(method = "upgradesChanged", at = @At("TAIL")) + private void extendedae_plus$onUpgradesChanged(CallbackInfo ci) { + IUpgradeInventory inv = this.getUpgrades(); + long channel = 0L; + boolean found = false; + for (var stack : inv) { + if (!stack.isEmpty() && stack.getItem() == ModItems.CHANNEL_CARD.get()) { + channel = ChannelCardItem.getChannel(stack); + found = true; + break; + } + } + if (!found) { + if (extendedae_plus$link != null) { + extendedae_plus$link.setFrequency(0L); + extendedae_plus$link.updateStatus(); + } + return; + } + if (extendedae_plus$link == null) { + var endpoint = new GenericNodeEndpointImpl( + () -> ((appeng.parts.AEBasePart)(Object)this).getHost().getBlockEntity(), + () -> ((IActionHost)(Object)this).getActionableNode() + ); + extendedae_plus$link = new WirelessSlaveLink(endpoint); + } + extendedae_plus$link.setFrequency(channel); + extendedae_plus$link.updateStatus(); + } + + @Override + public void extendedae_plus$updateWirelessLink() { + if (extendedae_plus$link != null) { + extendedae_plus$link.updateStatus(); + } + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartTickerChannelCardMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartTickerChannelCardMixin.java new file mode 100644 index 0000000..636b4e4 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartTickerChannelCardMixin.java @@ -0,0 +1,24 @@ +package com.extendedae_plus.mixin.ae2.parts.storagebus; + +import appeng.api.networking.IGridNode; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.parts.storagebus.StorageBusPart; +import com.extendedae_plus.bridge.InterfaceWirelessLinkBridge; +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; + +/** + * 在存储总线的 tickingRequest 尾部驱动无线链接刷新。 + */ +@Mixin(value = StorageBusPart.class, remap = false) +public abstract class StorageBusPartTickerChannelCardMixin { + + @Inject(method = "tickingRequest", at = @At("TAIL")) + private void extendedae_plus$tickTail(IGridNode node, int ticksSinceLastCall, CallbackInfoReturnable cir) { + if (this instanceof InterfaceWirelessLinkBridge bridge) { + bridge.extendedae_plus$updateWirelessLink(); + } + } +} diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index b584236..48e0c2e 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -67,6 +67,10 @@ "ae2.helpers.patternprovider.PatternProviderLogicHostUpgradesMixin", "ae2.menu.PatternProviderMenuUpgradesMixin", "ae2.helpers.patternprovider.PatternProviderLogicTickerMixin", + "ae2.parts.automation.IOBusPartChannelCardMixin", + "ae2.parts.automation.IOBusPartTickerChannelCardMixin", + "ae2.parts.storagebus.StorageBusPartChannelCardMixin", + "ae2.parts.storagebus.StorageBusPartTickerChannelCardMixin", "ae2WTlib.ContainerUWirelessExPatternTerminalMixin", "extendedae.common.PartExPatternProviderMixin", "extendedae.common.TileExPatternProviderMixin",