feat: 添加实体加速器对appflux存储电量的扣除支持
This commit is contained in:
parent
6b502aaada
commit
52cc600fb8
|
|
@ -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}"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
41
src/main/java/com/extendedae_plus/util/FluxEnergyHelper.java
Normal file
41
src/main/java/com/extendedae_plus/util/FluxEnergyHelper.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user