feat: 添加实体加速器对appflux存储电量的扣除支持

This commit is contained in:
C-H716 2025-09-27 14:16:24 +08:00
parent 6b502aaada
commit 52cc600fb8
3 changed files with 86 additions and 11 deletions

View File

@ -71,6 +71,7 @@ dependencies {
modImplementation "curse.maven:glodium-957920:${glodium_version}" modImplementation "curse.maven:glodium-957920:${glodium_version}"
//extendedAE //extendedAE
modImplementation files('libs/ExtendedAE-1.20-1.4.2-forge.jar') modImplementation files('libs/ExtendedAE-1.20-1.4.2-forge.jar')
modRuntimeOnly fileTree(dir: 'libs', includes: ['*.jar'])
//ae2 //ae2
modImplementation "appeng:appliedenergistics2-forge:${ae2_version}" modImplementation "appeng:appliedenergistics2-forge:${ae2_version}"

View File

@ -4,12 +4,15 @@ import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier; import appeng.api.config.PowerMultiplier;
import appeng.api.networking.GridFlags; import appeng.api.networking.GridFlags;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.api.networking.energy.IEnergyService;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.IGridTickable;
import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickRateModulation;
import appeng.api.networking.ticking.TickingRequest; import appeng.api.networking.ticking.TickingRequest;
import appeng.api.parts.IPartCollisionHelper; import appeng.api.parts.IPartCollisionHelper;
import appeng.api.parts.IPartItem; import appeng.api.parts.IPartItem;
import appeng.api.parts.IPartModel; import appeng.api.parts.IPartModel;
import appeng.api.storage.MEStorage;
import appeng.api.upgrades.IUpgradeableObject; import appeng.api.upgrades.IUpgradeableObject;
import appeng.core.definitions.AEItems; import appeng.core.definitions.AEItems;
import appeng.items.parts.PartModels; import appeng.items.parts.PartModels;
@ -35,10 +38,12 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
/** /**
@ -254,21 +259,49 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
} }
/** /**
* 提取网络能量并更新状态 * 提取网络能量并更新状态优先从 AE2 网络提取 AE 能量不足时从磁盘提取 FE 能量
* @param requiredPower 所需能量 * @param requiredPower 所需能量AE 单位
* @return 是否成功提取 * @return 是否成功提取足够能量
*/ */
private boolean extractPower(double requiredPower) { private boolean extractPower(double requiredPower) {
var energyService = getMainNode().getGrid().getEnergyService(); IEnergyService energyService = getMainNode().getGrid().getEnergyService();
MEStorage storage = getMainNode().getGrid().getStorageService().getInventory();
IActionSource source = IActionSource.ofMachine(this);
// 优先尝试提取 AE 能量
double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG); double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
if (simulated < requiredPower) { if (simulated >= requiredPower) {
updateNetworkEnergySufficient(false); double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
return false; boolean sufficient = extracted >= requiredPower;
updateNetworkEnergySufficient(sufficient);
return sufficient;
} }
double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG); updateNetworkEnergySufficient(false);
boolean sufficient = extracted >= requiredPower;
updateNetworkEnergySufficient(sufficient); // AE 能量不足尝试从磁盘提取 FE 能量如果 Applied Flux 存在
return sufficient; if (ModList.get().isLoaded("appflux")) {
try {
Class<?> helperClass = Class.forName("com.extendedae_plus.util.FluxEnergyHelper");
Method extractMethod = helperClass.getMethod(
"extractFE",
IEnergyService.class,
MEStorage.class,
long.class,
IActionSource.class
);
long feRequired = (long) requiredPower << 1; // 1 AE = 2 FE
long feExtracted = (long) extractMethod.invoke(null, energyService, storage, feRequired, source);
if (feExtracted >= feRequired) {
updateNetworkEnergySufficient(true);
return true;
}
} catch (Exception e) {
// 如果反射失败视为 FE 不可用
}
updateNetworkEnergySufficient(false);
}
return false;
} }
/** /**

View File

@ -0,0 +1,41 @@
package com.extendedae_plus.util;
import appeng.api.config.Actionable;
import appeng.api.networking.energy.IEnergyService;
import appeng.api.networking.security.IActionSource;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import com.glodblock.github.appflux.common.me.key.FluxKey;
import com.glodblock.github.appflux.common.me.key.type.EnergyType;
public class FluxEnergyHelper {
/**
* 尝试从 ME 存储提取 FE 能量
* @param energyService AE2 能量服务
* @param storage ME 存储
* @param feRequired 所需 FE
* @param source 操作来源
* @return 提取的 FE
*/
public static long extractFE(
IEnergyService energyService,
MEStorage storage,
long feRequired,
IActionSource source
) {
FluxKey feKey = FluxKey.of(EnergyType.FE);
// 模拟提取 FE
long feExtracted = StorageHelper.poweredExtraction(
energyService, storage, feKey, feRequired, source, Actionable.SIMULATE
);
// 执行实际提取
if (feExtracted >= feRequired) {
return StorageHelper.poweredExtraction(
energyService, storage, feKey, feRequired, source, Actionable.MODULATE
);
}
return 0;
}
}