支持更多方块插入频道卡

This commit is contained in:
GaLicn 2025-09-22 19:01:13 +08:00
parent 8a4950f244
commit 1589f179cd
6 changed files with 213 additions and 0 deletions

View File

@ -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);
});
}
}

View File

@ -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();
}
}
}

View File

@ -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<TickRateModulation> cir) {
if (this instanceof InterfaceWirelessLinkBridge bridge) {
bridge.extendedae_plus$updateWirelessLink();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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<TickRateModulation> cir) {
if (this instanceof InterfaceWirelessLinkBridge bridge) {
bridge.extendedae_plus$updateWirelessLink();
}
}
}

View File

@ -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",