Skip to content

[漏洞] 有时不能传输能量 #2

@Phoupraw

Description

@Phoupraw
  1. 输出通道直接贴着电池箱,不充电
  2. 输出通道与输入通道方向相同,不充电
  3. 不满足1和2,正常充电

Image

我看了一下EUP2PTunnelPart的源码,没看懂……所以我自己实现了一个,经过测试,在1和2的情况下也能正常传电。
(因为gradle就是一坨,加载新项目大概率失败,所以我克隆了这个项目也没用,也就开不了PR,直接把代码发到这里,代码量很少,只需要修改1个原有类EUP2PTunnelPart和增加一个新类ForwardingEnergyContainer。)

public class GTEUP2PTunnelPart extends CapabilityP2PTunnelPart<GTEUP2PTunnelPart, IEnergyContainer> {
    public GTEUP2PTunnelPart(IPartItem<?> partItem) {
        super(partItem, GTCapability.CAPABILITY_ENERGY_CONTAINER);
        inputHandler = (ForwardingEnergyContainer<IEnergyContainer>) this::getInputDelegate;
        outputHandler = (ForwardingEnergyContainer<IEnergyContainer>) this::getOutputDelegate;
        emptyHandler = IEnergyContainer.DEFAULT;
    }
    public IEnergyContainer getDelegate() {
        var location = getHost().getLocation();
        var level = location.getLevel();
        var pos = location.getPos();
        var side = getSide();
        var pos1 = pos.relative(side);
        return Objects.requireNonNullElse(GTCapabilityHelper.getEnergyContainer(level, pos1, side.getOpposite()), emptyHandler);
    }
    private IEnergyContainer getOutputDelegate() {
        var input = getInput();
        return input != null ? input.getDelegate() : emptyHandler;
    }
    private IEnergyContainer getInputDelegate() {
        var outputs = getOutputs();
        if (outputs.isEmpty()) {
            return emptyHandler;
        }
        List<IEnergyContainer> delegates = new ObjectArrayList<>(outputs.size());
        for (var output : outputs) {
            delegates.add(output.getDelegate());
        }
        return new EnergyContainerList(delegates);
    }
}
public interface ForwardingEnergyContainer<T extends IEnergyContainer> extends IEnergyContainer {
    default long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) {
        return getDelegate().acceptEnergyFromNetwork(side, voltage, amperage);
    }
    default boolean inputsEnergy(Direction side) {
        return getDelegate().inputsEnergy(side);
    }
    default boolean outputsEnergy(Direction side) {
        return getDelegate().outputsEnergy(side);
    }
    default long changeEnergy(long differenceAmount) {
        return getDelegate().changeEnergy(differenceAmount);
    }
    default long addEnergy(long energyToAdd) {
        return getDelegate().addEnergy(energyToAdd);
    }
    default long removeEnergy(long energyToRemove) {
        return getDelegate().removeEnergy(energyToRemove);
    }
    default long getEnergyCanBeInserted() {
        return getDelegate().getEnergyCanBeInserted();
    }
    default long getEnergyStored() {
        return getDelegate().getEnergyStored();
    }
    default long getEnergyCapacity() {
        return getDelegate().getEnergyCapacity();
    }
    default EnergyInfo getEnergyInfo() {
        return getDelegate().getEnergyInfo();
    }
    default boolean supportsBigIntEnergyValues() {
        return getDelegate().supportsBigIntEnergyValues();
    }
    default long getOutputAmperage() {
        return getDelegate().getOutputAmperage();
    }
    default long getOutputVoltage() {
        return getDelegate().getOutputVoltage();
    }
    default long getInputAmperage() {
        return getDelegate().getInputAmperage();
    }
    default long getInputVoltage() {
        return getDelegate().getInputVoltage();
    }
    default long getInputPerSec() {
        return getDelegate().getInputPerSec();
    }
    default long getOutputPerSec() {
        return getDelegate().getOutputPerSec();
    }
    default boolean isOneProbeHidden() {
        return getDelegate().isOneProbeHidden();
    }
    T getDelegate();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions