Core code for new energy framework. Still to do FluidNetwork and GasNetwork.

This commit is contained in:
Aidan Brady 2013-12-13 23:42:27 -05:00
parent a05870a2ef
commit efc98114e8
4 changed files with 51 additions and 156 deletions

View file

@ -2,7 +2,6 @@ package mekanism.common;
import ic2.api.energy.tile.IEnergySink;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@ -11,12 +10,10 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
import mekanism.api.Object3D;
import mekanism.api.energy.IStrictEnergyAcceptor;
import mekanism.api.transmitters.DynamicNetwork;
import mekanism.api.transmitters.ITransmitter;
import mekanism.api.transmitters.TransmissionType;
import mekanism.common.tileentity.TileEntityUniversalCable;
import mekanism.common.util.CableUtils;
import mekanism.common.util.MekanismUtils;
import net.minecraft.tileentity.TileEntity;
@ -33,12 +30,16 @@ import cpw.mods.fml.common.FMLCommonHandler;
public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
{
public static final int CABLE_ENERGY = 10000;
private double lastPowerScale = 0;
private double joulesTransmitted = 0;
private double joulesLastTick = 0;
public double clientEnergyScale = 0;
public double electricityStored;
public EnergyNetwork(ITransmitter<EnergyNetwork>... varCables)
{
transmitters.addAll(Arrays.asList(varCables));
@ -74,54 +75,22 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
register();
}
public synchronized double getEnergyNeeded(List<TileEntity> ignored)
public double getCapacity()
{
return CABLE_ENERGY*transmitters.size();
}
public synchronized double getEnergyNeeded()
{
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
return 0;
}
double totalNeeded = 0;
for(TileEntity acceptor : getAcceptors())
{
if(acceptorDirections.get(acceptor) == null)
{
continue;
}
ForgeDirection side = acceptorDirections.get(acceptor).getOpposite();
if(!ignored.contains(acceptor))
{
if(acceptor instanceof IStrictEnergyAcceptor)
{
totalNeeded += (((IStrictEnergyAcceptor)acceptor).getMaxEnergy() - ((IStrictEnergyAcceptor)acceptor).getEnergy());
}
else if(acceptor instanceof IEnergyHandler)
{
IEnergyHandler handler = (IEnergyHandler)acceptor;
totalNeeded += handler.receiveEnergy(side, Integer.MAX_VALUE, true)*Mekanism.FROM_TE;
}
else if(acceptor instanceof IEnergySink)
{
totalNeeded += Math.min((((IEnergySink)acceptor).demandedEnergyUnits()*Mekanism.FROM_IC2), (((IEnergySink)acceptor).getMaxSafeInput()*Mekanism.FROM_IC2));
}
else if(acceptor instanceof IPowerReceptor && MekanismUtils.useBuildcraft())
{
totalNeeded += (((IPowerReceptor)acceptor).getPowerReceiver(side).powerRequest()*Mekanism.FROM_BC);
}
else if(acceptor instanceof IElectrical)
{
totalNeeded += ((IElectrical)acceptor).getRequest(side)*Mekanism.FROM_UE;
}
}
}
return totalNeeded;
return getCapacity()-electricityStored;
}
public synchronized double emit(double energyToSend, ArrayList<TileEntity> ignored)
public synchronized double tickEmit(double energyToSend)
{
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
@ -131,7 +100,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
double prevEnergy = energyToSend;
double sent;
energyToSend = doEmit(energyToSend, ignored);
energyToSend = doEmit(energyToSend);
sent = prevEnergy-energyToSend;
boolean tryAgain = energyToSend > 0 && sent > 0;
@ -143,7 +112,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
prevEnergy = energyToSend;
sent = 0;
energyToSend -= (energyToSend - doEmit(energyToSend, ignored));
energyToSend -= (energyToSend - doEmit(energyToSend));
sent = prevEnergy-energyToSend;
if(energyToSend > 0 && sent > 0)
@ -155,10 +124,17 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
return energyToSend;
}
public synchronized double emit(double energyToSend)
{
double toUse = Math.min(getEnergyNeeded(), energyToSend);
electricityStored += toUse;
return energyToSend-toUse;
}
/**
* @return rejects
*/
public synchronized double doEmit(double energyToSend, ArrayList<TileEntity> ignored)
public synchronized double doEmit(double energyToSend)
{
double energyAvailable = energyToSend;
double sent;
@ -175,7 +151,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
for(Object obj : availableAcceptors)
{
if(obj instanceof TileEntity && !ignored.contains(obj))
if(obj instanceof TileEntity)
{
TileEntity acceptor = (TileEntity)obj;
double currentSending = sending+remaining;
@ -307,12 +283,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
{
if((handler.getPowerReceiver(side.getOpposite()).powerRequest()*Mekanism.FROM_BC) > 0)
{
TileEntityUniversalCable cable = (TileEntityUniversalCable)Object3D.get(acceptor).getFromSide(side.getOpposite()).getTileEntity(acceptor.worldObj);
if(cable != null && !cable.getBuildCraftIgnored().contains(acceptor))
{
toReturn.add(acceptor);
}
toReturn.add(acceptor);
}
}
}
@ -404,7 +375,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
{
if(currentPowerScale != lastPowerScale)
if(Math.abs(currentPowerScale-lastPowerScale) > 0.01 || (currentPowerScale != lastPowerScale && (currentPowerScale == 0 || currentPowerScale == 1)))
{
needsUpdate = true;
}
@ -416,12 +387,17 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale));
needsUpdate = false;
}
if(electricityStored > 0)
{
electricityStored -= (electricityStored - tickEmit(electricityStored));
}
}
}
public double getPowerScale()
{
return joulesLastTick == 0 ? 0 : Math.min(Math.ceil(Math.log10(getPower())*2)/10, 1);
return Math.max(joulesLastTick == 0 ? 0 : Math.min(Math.ceil(Math.log10(getPower())*2)/10, 1), electricityStored/getCapacity());
}
public void clearJoulesTransmitted()
@ -482,12 +458,12 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
@Override
public String getNeeded()
{
return MekanismUtils.getEnergyDisplay(getEnergyNeeded(new ArrayList<TileEntity>()));
return MekanismUtils.getEnergyDisplay(getEnergyNeeded());
}
@Override
public String getFlow()
{
return MekanismUtils.getEnergyDisplay(getPower());
return MekanismUtils.getEnergyDisplay(electricityStored);
}
}

View file

@ -2,36 +2,12 @@ package mekanism.common.multipart;
import ic2.api.energy.event.EnergyTileLoadEvent;
import ic2.api.energy.event.EnergyTileUnloadEvent;
import ic2.api.energy.tile.IEnergyAcceptor;
import ic2.api.energy.tile.IEnergySink;
import ic2.api.energy.tile.IEnergyTile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import codechicken.lib.vec.Vector3;
import codechicken.multipart.TileMultipart;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.util.Icon;
import universalelectricity.core.block.IConductor;
import universalelectricity.core.block.IElectrical;
import universalelectricity.core.electricity.ElectricityPack;
import universalelectricity.core.grid.IElectricityNetwork;
import buildcraft.api.power.IPowerEmitter;
import buildcraft.api.power.IPowerReceptor;
import buildcraft.api.power.PowerHandler;
import buildcraft.api.power.PowerHandler.PowerReceiver;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge;
import mekanism.api.Object3D;
import mekanism.api.energy.ICableOutputter;
import mekanism.api.energy.IStrictEnergyAcceptor;
import mekanism.api.transmitters.ITransmitter;
import mekanism.api.transmitters.TransmissionType;
import mekanism.client.render.PartTransmitterIcons;
@ -39,7 +15,9 @@ import mekanism.client.render.RenderPartTransmitter;
import mekanism.common.EnergyNetwork;
import mekanism.common.Mekanism;
import mekanism.common.util.CableUtils;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Icon;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge;
import universalelectricity.core.block.IElectrical;
@ -213,7 +191,7 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
@Override
public double demandedEnergyUnits()
{
return getTransmitterNetwork().getEnergyNeeded(new ArrayList())*Mekanism.TO_IC2;
return getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_IC2;
}
@Override
@ -225,20 +203,15 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
@Override
public double injectEnergyUnits(ForgeDirection direction, double i)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(tile()).getFromSide(direction).getTileEntity(world()));
return getTransmitterNetwork().emit(i*Mekanism.FROM_IC2, list)*Mekanism.TO_IC2;
return getTransmitterNetwork().emit(i*Mekanism.FROM_IC2)*Mekanism.TO_IC2;
}
@Override
public float receiveElectricity(ForgeDirection from, ElectricityPack receive, boolean doReceive)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(tile()).getFromSide(from).getTileEntity(world()));
if(doReceive && receive != null && receive.getWatts() > 0)
{
return receive.getWatts() - (float)(getTransmitterNetwork().emit(receive.getWatts()*Mekanism.FROM_UE, list));
return receive.getWatts() - (float)(getTransmitterNetwork().emit(receive.getWatts()*Mekanism.FROM_UE));
}
return 0;
@ -253,9 +226,7 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
@Override
public float getRequest(ForgeDirection direction)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(tile()).getFromSide(direction).getTileEntity(world()));
return (float)(getTransmitterNetwork().getEnergyNeeded(list)*Mekanism.TO_UE);
return (float)(getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_UE);
}
@Override
@ -273,12 +244,9 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(tile()).getFromSide(from).getTileEntity(world()));
if(!simulate)
{
return maxReceive - (int)Math.round(getTransmitterNetwork().emit(maxReceive*Mekanism.FROM_TE, list)*Mekanism.TO_TE);
return maxReceive - (int)Math.round(getTransmitterNetwork().emit(maxReceive*Mekanism.FROM_TE)*Mekanism.TO_TE);
}
return 0;
@ -305,8 +273,6 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
@Override
public int getMaxEnergyStored(ForgeDirection from)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(tile()).getFromSide(from).getTileEntity(world()));
return (int)Math.round(getTransmitterNetwork().getEnergyNeeded(list)*Mekanism.TO_TE);
return (int)Math.round(getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_TE);
}
}

View file

@ -4,7 +4,6 @@ import ic2.api.energy.event.EnergyTileLoadEvent;
import ic2.api.energy.event.EnergyTileUnloadEvent;
import ic2.api.energy.tile.IEnergySink;
import java.util.ArrayList;
import java.util.HashSet;
import mekanism.api.Object3D;
@ -22,7 +21,6 @@ import net.minecraftforge.common.MinecraftForge;
import universalelectricity.core.block.IElectrical;
import universalelectricity.core.electricity.ElectricityPack;
import universalelectricity.core.grid.IElectricityNetwork;
import buildcraft.api.power.IPowerEmitter;
import buildcraft.api.power.IPowerReceptor;
import buildcraft.api.power.PowerHandler;
import buildcraft.api.power.PowerHandler.PowerReceiver;
@ -170,7 +168,7 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public PowerReceiver getPowerReceiver(ForgeDirection side)
{
if(getTransmitterNetwork().getEnergyNeeded(getBuildCraftIgnored()) == 0)
if(getTransmitterNetwork().getEnergyNeeded() == 0)
{
return null;
}
@ -188,39 +186,10 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
{
if(MekanismUtils.useBuildcraft())
{
float needed = (float)(getTransmitterNetwork().getEnergyNeeded(getBuildCraftIgnored())*Mekanism.TO_BC);
float needed = (float)(getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_BC);
powerHandler.configure(1, needed, 0, needed);
}
}
public ArrayList<TileEntity> getBuildCraftIgnored()
{
ArrayList<TileEntity> ignored = new ArrayList<TileEntity>();
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tile = Object3D.get(this).getFromSide(side).getTileEntity(worldObj);
if(tile != null)
{
if(powerHandler.powerSources[side.ordinal()] > 0)
{
ignored.add(tile);
}
else if(tile instanceof IPowerEmitter)
{
IPowerEmitter emitter = (IPowerEmitter)tile;
if(emitter.canEmitPowerFrom(side.getOpposite()))
{
ignored.add(tile);
}
}
}
}
return ignored;
}
@Override
public void doWork(PowerHandler workProvider)
@ -229,7 +198,7 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
{
if(powerHandler.getEnergyStored() > 0)
{
getTransmitterNetwork().emit(powerHandler.getEnergyStored()*Mekanism.FROM_BC, getBuildCraftIgnored());
getTransmitterNetwork().emit(powerHandler.getEnergyStored()*Mekanism.FROM_BC);
}
powerHandler.setEnergy(0);
@ -256,15 +225,13 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public double demandedEnergyUnits()
{
return getTransmitterNetwork().getEnergyNeeded(getBuildCraftIgnored())*Mekanism.TO_IC2;
return getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_IC2;
}
@Override
public double injectEnergyUnits(ForgeDirection direction, double i)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(this).getFromSide(direction).getTileEntity(worldObj));
return getTransmitterNetwork().emit(i*Mekanism.FROM_IC2, list)*Mekanism.TO_IC2;
return getTransmitterNetwork().emit(i*Mekanism.FROM_IC2)*Mekanism.TO_IC2;
}
@Override
@ -300,12 +267,9 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(this).getFromSide(from).getTileEntity(worldObj));
if(!simulate)
{
return maxReceive - (int)Math.round(getTransmitterNetwork().emit(maxReceive*Mekanism.FROM_TE, list)*Mekanism.TO_TE);
return maxReceive - (int)Math.round(getTransmitterNetwork().emit(maxReceive*Mekanism.FROM_TE)*Mekanism.TO_TE);
}
return 0;
@ -332,9 +296,7 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public int getMaxEnergyStored(ForgeDirection from)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(this).getFromSide(from).getTileEntity(worldObj));
return (int)Math.round(getTransmitterNetwork().getEnergyNeeded(list)*Mekanism.TO_TE);
return (int)Math.round(getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_TE);
}
@Override
@ -346,12 +308,9 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public float receiveElectricity(ForgeDirection from, ElectricityPack receive, boolean doReceive)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(this).getFromSide(from).getTileEntity(worldObj));
if(doReceive && receive != null && receive.getWatts() > 0)
{
return receive.getWatts() - (float)(getTransmitterNetwork().emit(receive.getWatts()*Mekanism.FROM_UE, list));
return receive.getWatts() - (float)(getTransmitterNetwork().emit(receive.getWatts()*Mekanism.FROM_UE));
}
return 0;
@ -366,9 +325,7 @@ public class TileEntityUniversalCable extends TileEntityTransmitter<EnergyNetwor
@Override
public float getRequest(ForgeDirection direction)
{
ArrayList list = new ArrayList();
list.add(Object3D.get(this).getFromSide(direction).getTileEntity(worldObj));
return (float)(getTransmitterNetwork().getEnergyNeeded(list)*Mekanism.TO_UE);
return (float)(getTransmitterNetwork().getEnergyNeeded()*Mekanism.TO_UE);
}
@Override

View file

@ -6,7 +6,6 @@ import ic2.api.energy.tile.IEnergySource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import mekanism.api.Object3D;
@ -231,10 +230,7 @@ public final class CableUtils
{
ITransmitter<EnergyNetwork> cable = (ITransmitter<EnergyNetwork>)pointer;
ArrayList<TileEntity> ignored = new ArrayList<TileEntity>();
ignored.add(sender);
return cable.getTransmitterNetwork().emit(amount, ignored);
return cable.getTransmitterNetwork().emit(amount);
}
return amount;