Fixed issues with energy loops through wires outside of mechanical multiblocks

This commit is contained in:
malte0811 2018-06-15 09:35:14 +02:00
parent 2b9ec80253
commit e377b77819
5 changed files with 121 additions and 8 deletions

View file

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

View file

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

View file

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

View file

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

View file

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