Fixed issues with energy loops through wires outside of mechanical multiblocks
This commit is contained in:
parent
2b9ec80253
commit
e377b77819
|
@ -395,6 +395,7 @@ public class TileEntityMechMB extends TileEntityIWMultiblock implements ITickabl
|
|||
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
|
||||
Vec3i offsetDirectional = getOffsetDir();
|
||||
TileEntityMechMB master = masterOr(this, this);
|
||||
|
||||
int id = getPart(offsetDirectional.getZ(), master);
|
||||
if (id < 0) {
|
||||
return null;
|
||||
|
|
|
@ -34,11 +34,15 @@ public interface IMBPartElectric {
|
|||
void extractEEnergy(double energy);
|
||||
double requestEEnergy(Waveform waveform, MechEnergy energy);
|
||||
void insertEEnergy(double given, Waveform waveform, MechEnergy energy);
|
||||
void setLastIOState(IOState state);
|
||||
IOState getLastIOState();
|
||||
|
||||
default Set<Pair<BlockPos, EnumFacing>> getEnergyConnections() {
|
||||
return ImmutableSet.of();
|
||||
}
|
||||
default double outputFE(LocalSidedWorld world, int available) {
|
||||
if (!getLastIOState().canSwitchToOutput())
|
||||
return 0;
|
||||
double extracted = 0;
|
||||
for (Pair<BlockPos, EnumFacing> output : getEnergyConnections()) {
|
||||
if (output.getRight()==null)
|
||||
|
@ -55,6 +59,23 @@ public interface IMBPartElectric {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (extracted>0) {
|
||||
setLastIOState(IOState.OUTPUT);
|
||||
}
|
||||
return extracted;
|
||||
}
|
||||
|
||||
enum IOState {
|
||||
NO_TRANSFER,
|
||||
OUTPUT,
|
||||
INPUT;
|
||||
|
||||
boolean canSwitchToOutput() {
|
||||
return NO_TRANSFER ==this||OUTPUT==this;
|
||||
}
|
||||
|
||||
boolean canSwitchToInput() {
|
||||
return NO_TRANSFER ==this||INPUT==this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import java.util.Set;
|
||||
|
||||
import static malte0811.industrialWires.converter.EUCapability.ENERGY_IC2;
|
||||
import static malte0811.industrialWires.converter.IMBPartElectric.IOState.*;
|
||||
import static malte0811.industrialWires.converter.Waveform.Phases.get;
|
||||
import static malte0811.industrialWires.converter.Waveform.Speed.EXTERNAL;
|
||||
import static malte0811.industrialWires.converter.Waveform.Speed.ROTATION;
|
||||
|
@ -53,6 +54,9 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
private Waveform wfToMB = Waveform.forParameters(NONE, get(has4Phases()), ROTATION);
|
||||
private double bufferToWorld;
|
||||
private Waveform wfToWorld = Waveform.forParameters(NONE, get(has4Phases()), ROTATION);
|
||||
private IOState lastIOState = NO_TRANSFER;
|
||||
private long lastStateChange = Long.MIN_VALUE;
|
||||
|
||||
@Override
|
||||
public Waveform getProduced(MechEnergy state) {
|
||||
return wfToMB.getCommutated(state.getSpeed(), has4Phases());
|
||||
|
@ -83,6 +87,17 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
bufferToWorld += given;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLastIOState(IOState state) {
|
||||
lastIOState = state;
|
||||
lastStateChange = world.getWorld().getTotalWorldTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IOState getLastIOState() {
|
||||
return lastIOState;
|
||||
}
|
||||
|
||||
|
||||
private final IC2EnergyHandler capIc2 = new IC2EnergyHandler() {
|
||||
{
|
||||
|
@ -100,14 +115,24 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
buffer += input;
|
||||
bufferToMB = buffer;
|
||||
wfToMB = Waveform.forParameters(DC, get(has4Phases()), EXTERNAL);
|
||||
setLastIOState(INPUT);
|
||||
return amount-ConversionUtil.euPerJoule()*input;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getOfferedEnergy() {
|
||||
if (wfToWorld.isDC()) {
|
||||
if (wfToWorld.isDC() && getLastIOState().canSwitchToOutput()) {
|
||||
return Math.min(ConversionUtil.euPerJoule()*bufferToWorld,
|
||||
ConversionUtil.euPerJoule()*getMaxBuffer())/getEnergyConnections().size()*2;
|
||||
ConversionUtil.euPerJoule()*getMaxBuffer()/getEnergyConnections().size()*2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDemandedEnergy() {
|
||||
if (getLastIOState().canSwitchToInput()) {
|
||||
return Math.min(ConversionUtil.euPerJoule()*(getMaxBuffer()-bufferToMB),
|
||||
ConversionUtil.euPerJoule()*getMaxBuffer()/getEnergyConnections().size()*2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -115,12 +140,16 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
@Override
|
||||
public void drawEnergy(double amount) {
|
||||
bufferToWorld -= ConversionUtil.joulesPerEu()*amount;
|
||||
setLastIOState(OUTPUT);
|
||||
}
|
||||
};
|
||||
|
||||
private IEnergyStorage capForge = new IEnergyStorage() {
|
||||
@Override
|
||||
public int receiveEnergy(int maxReceive, boolean simulate) {
|
||||
if (!getLastIOState().canSwitchToInput()) {
|
||||
return 0;
|
||||
}
|
||||
double buffer = bufferToMB;
|
||||
double input = maxReceive* ConversionUtil.joulesPerIf();
|
||||
if (!wfToMB.isAC()) {
|
||||
|
@ -131,21 +160,27 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
if (!simulate) {
|
||||
bufferToMB = buffer;
|
||||
wfToMB = Waveform.forParameters(Waveform.Type.AC, get(has4Phases()), EXTERNAL);
|
||||
if (input>0) {
|
||||
setLastIOState(INPUT);
|
||||
}
|
||||
}
|
||||
return (int) (ConversionUtil.ifPerJoule()*input);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int extractEnergy(int maxExtract, boolean simulate) {
|
||||
if (!wfToWorld.isAC()) {
|
||||
if (!wfToWorld.isAC() || !getLastIOState().canSwitchToOutput()) {
|
||||
return 0;
|
||||
}
|
||||
double buffer = bufferToWorld;
|
||||
double output = maxExtract* ConversionUtil.joulesPerIf();
|
||||
output = Math.min(output, getMaxBuffer()-buffer);
|
||||
buffer += output;
|
||||
output = Math.min(output, buffer);
|
||||
buffer -= output;
|
||||
if (!simulate) {
|
||||
bufferToWorld = buffer;
|
||||
if (output>0) {
|
||||
setLastIOState(OUTPUT);
|
||||
}
|
||||
}
|
||||
return (int) (ConversionUtil.ifPerJoule()*output);
|
||||
}
|
||||
|
@ -206,7 +241,11 @@ public class MechPartCommutator extends MechMBPart implements IMBPartElectric {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void insertMEnergy(double added) {int available = (int) (Math.min(ConversionUtil.ifPerJoule() * bufferToWorld,
|
||||
public void insertMEnergy(double added) {
|
||||
if (world.getWorld().getTotalWorldTime()>lastStateChange+1) {
|
||||
setLastIOState(NO_TRANSFER);
|
||||
}
|
||||
int available = (int) (Math.min(ConversionUtil.ifPerJoule() * bufferToWorld,
|
||||
getMaxBuffer()/getEnergyConnections().size()));
|
||||
if (available > 0 && wfToWorld.isAC()) {//The IC2 net will deal with DC by itself
|
||||
bufferToWorld -= outputFE(world, available);
|
||||
|
|
|
@ -81,6 +81,17 @@ public class MechPartSingleCoil extends MechMBPart implements IMBPartElectric {
|
|||
}
|
||||
}
|
||||
|
||||
//TODO clean this up once I know whether it works
|
||||
@Override
|
||||
public void setLastIOState(IOState state) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public IOState getLastIOState() {
|
||||
return IOState.NO_TRANSFER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createMEnergy(MechEnergy e) {
|
||||
e.addEnergy(bufferToMech);
|
||||
|
|
|
@ -38,6 +38,7 @@ import java.util.Set;
|
|||
import static blusunrize.immersiveengineering.common.IEContent.blockMetalDecoration0;
|
||||
import static blusunrize.immersiveengineering.common.blocks.metal.BlockTypes_MetalDecoration0.GENERATOR;
|
||||
import static malte0811.industrialWires.converter.EUCapability.ENERGY_IC2;
|
||||
import static malte0811.industrialWires.converter.IMBPartElectric.IOState.*;
|
||||
import static malte0811.industrialWires.converter.Waveform.Phases.get;
|
||||
import static malte0811.industrialWires.converter.Waveform.Speed.EXTERNAL;
|
||||
import static malte0811.industrialWires.converter.Waveform.Type.DC;
|
||||
|
@ -52,6 +53,8 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
private Waveform wfToMB = Waveform.forParameters(Waveform.Type.NONE, get(has4Phases()), Waveform.Speed.EXTERNAL);
|
||||
private double bufferToWorld;
|
||||
private Waveform wfToWorld = Waveform.forParameters(Waveform.Type.NONE, get(has4Phases()), Waveform.Speed.ROTATION);
|
||||
private IOState lastIO = NO_TRANSFER;
|
||||
private long lastStateChange = Long.MIN_VALUE;
|
||||
|
||||
{
|
||||
original.put(ORIGIN, blockMetalDecoration0.getDefaultState().withProperty(
|
||||
|
@ -87,6 +90,17 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
wfToWorld = waveform;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLastIOState(IOState state) {
|
||||
lastIO = state;
|
||||
lastStateChange = world.getWorld().getTotalWorldTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IOState getLastIOState() {
|
||||
return lastIO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createMEnergy(MechEnergy e) {}
|
||||
|
||||
|
@ -97,6 +111,9 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
|
||||
@Override
|
||||
public void insertMEnergy(double added) {
|
||||
if (world.getWorld().getTotalWorldTime()>lastStateChange+1) {
|
||||
setLastIOState(NO_TRANSFER);
|
||||
}
|
||||
int available = (int) (Math.min(ConversionUtil.ifPerJoule() * bufferToWorld,
|
||||
getMaxBuffer()/getEnergyConnections().size()));
|
||||
if (available > 0 && wfToWorld.isAC()) {//The IC2 net will deal with DC by itself
|
||||
|
@ -171,6 +188,9 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
private IEnergyStorage energy = new IEnergyStorage() {
|
||||
@Override
|
||||
public int receiveEnergy(int maxReceive, boolean simulate) {
|
||||
if (!getLastIOState().canSwitchToInput()) {
|
||||
return 0;
|
||||
}
|
||||
double joules = joulesPerIf()*maxReceive;
|
||||
double insert = Math.min(Math.min(joules, getMaxBuffer()-bufferToMB),
|
||||
getMaxBuffer()/getEnergyConnections().size());
|
||||
|
@ -179,6 +199,9 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
bufferToMB = 0;
|
||||
wfToMB = Waveform.forParameters(Waveform.Type.AC, get(has4Phases()), Waveform.Speed.EXTERNAL);
|
||||
}
|
||||
if (insert>0) {
|
||||
setLastIOState(INPUT);
|
||||
}
|
||||
bufferToMB += insert;
|
||||
}
|
||||
return (int) Math.ceil(insert* ifPerJoule());
|
||||
|
@ -186,11 +209,18 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
|
||||
@Override
|
||||
public int extractEnergy(int maxExtract, boolean simulate) {
|
||||
if (!getLastIOState().canSwitchToOutput()) {
|
||||
return 0;
|
||||
}
|
||||
if (wfToWorld.isAC()) {
|
||||
double joules = joulesPerIf() * maxExtract;
|
||||
double extract = Math.min(Math.min(joules, bufferToWorld), getMaxBuffer()/getEnergyConnections().size());
|
||||
if (!simulate)
|
||||
if (!simulate) {
|
||||
bufferToWorld -= extract;
|
||||
if (extract>0) {
|
||||
setLastIOState(OUTPUT);
|
||||
}
|
||||
}
|
||||
return (int) Math.floor(extract * ifPerJoule());
|
||||
} else {
|
||||
return 0;
|
||||
|
@ -269,21 +299,32 @@ public class MechPartTwoElectrodes extends MechMBPart implements IMBPartElectric
|
|||
buffer += input;
|
||||
bufferToMB = buffer;
|
||||
wfToMB = Waveform.forParameters(DC, get(has4Phases()), EXTERNAL);
|
||||
setLastIOState(INPUT);
|
||||
return amount-ConversionUtil.euPerJoule()*input;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getOfferedEnergy() {
|
||||
if (wfToWorld.isDC()) {
|
||||
if (wfToWorld.isDC() && getLastIOState().canSwitchToOutput()) {
|
||||
return Math.min(ConversionUtil.euPerJoule()*bufferToWorld,
|
||||
ConversionUtil.euPerJoule()*getMaxBuffer())/getEnergyConnections().size()*2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDemandedEnergy() {
|
||||
if (getLastIOState().canSwitchToInput()) {
|
||||
return Math.min(ConversionUtil.euPerJoule()*(getMaxBuffer()-bufferToMB),
|
||||
ConversionUtil.euPerJoule()*getMaxBuffer()/getEnergyConnections().size()*2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawEnergy(double amount) {
|
||||
bufferToWorld -= ConversionUtil.joulesPerEu()*amount;
|
||||
setLastIOState(OUTPUT);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue