Mekanism-tilera-Edition/src/main/java/mekanism/common/EnergyNetwork.java

331 lines
7.7 KiB
Java
Raw Normal View History

package mekanism.common;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.api.MekanismConfig.general;
import mekanism.api.energy.EnergyAcceptorWrapper;
import mekanism.api.energy.EnergyStack;
import mekanism.api.energy.IStrictEnergyAcceptor;
import mekanism.api.transmitters.DynamicNetwork;
2013-12-21 01:12:33 +01:00
import mekanism.api.transmitters.IGridTransmitter;
import mekanism.common.util.MekanismUtils;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.MinecraftForge;
2014-06-02 23:57:40 +02:00
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.Event;
Update lots of APIs, most notably BC and an actual 1.7 version of CC Conflicts: build.properties src/api/java/buildcraft/api/core/BlockIndex.java src/api/java/buildcraft/api/core/BuildCraftAPI.java src/api/java/buildcraft/api/fuels/IFuel.java src/api/java/buildcraft/api/mj/BatteryObject.java src/api/java/buildcraft/api/mj/IBatteryIOObject.java src/api/java/buildcraft/api/mj/IBatteryObject.java src/api/java/buildcraft/api/mj/IOMode.java src/api/java/buildcraft/api/mj/MjAPI.java src/api/java/buildcraft/api/mj/MjBattery.java src/api/java/buildcraft/api/power/PowerHandler.java src/api/java/buildcraft/api/recipes/CraftingResult.java src/api/java/buildcraft/api/recipes/IAssemblyRecipeManager.java src/api/java/buildcraft/api/recipes/IFlexibleRecipe.java src/api/java/buildcraft/api/recipes/IRefineryRecipeManager.java src/api/java/buildcraft/api/transport/IPipe.java src/main/java/mekanism/common/CommonProxy.java src/main/java/mekanism/common/EnergyNetwork.java src/main/java/mekanism/common/FuelHandler.java src/main/java/mekanism/common/Mekanism.java src/main/java/mekanism/common/base/IAdvancedBoundingBlock.java src/main/java/mekanism/common/multipart/MultipartMekanism.java src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java src/main/java/mekanism/common/multipart/PartUniversalCable.java src/main/java/mekanism/common/network/PacketConfigSync.java src/main/java/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java src/main/java/mekanism/common/tile/TileEntityElectricBlock.java src/main/java/mekanism/common/util/CableUtils.java src/main/java/mekanism/common/util/MekanismUtils.java src/main/java/mekanism/common/util/TransporterUtils.java src/main/java/mekanism/generators/common/MekanismGenerators.java src/main/java/mekanism/generators/common/tile/TileEntityBioGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGasGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityHeatGenerator.java src/main/java/mekanism/generators/common/tile/TileEntitySolarGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityWindTurbine.java
2014-11-10 22:51:37 +01:00
import cofh.api.energy.IEnergyReceiver;
import ic2.api.energy.EnergyNet;
import ic2.api.energy.tile.IEnergySink;
public class EnergyNetwork extends DynamicNetwork<EnergyAcceptorWrapper, EnergyNetwork>
{
private double lastPowerScale = 0;
private double joulesTransmitted = 0;
private double jouleBufferLastTick = 0;
public double clientEnergyScale = 0;
public EnergyStack buffer = new EnergyStack(0);
public EnergyNetwork() {}
public EnergyNetwork(Collection<EnergyNetwork> networks)
2013-07-28 04:32:41 +02:00
{
2013-07-31 22:44:53 +02:00
for(EnergyNetwork net : networks)
2013-07-28 04:32:41 +02:00
{
if(net != null)
{
if(net.jouleBufferLastTick > jouleBufferLastTick || net.clientEnergyScale > clientEnergyScale)
2013-11-29 19:04:39 +01:00
{
clientEnergyScale = net.clientEnergyScale;
jouleBufferLastTick = net.jouleBufferLastTick;
2013-11-29 19:04:39 +01:00
joulesTransmitted = net.joulesTransmitted;
lastPowerScale = net.lastPowerScale;
}
buffer.amount += net.buffer.amount;
adoptTransmittersAndAcceptorsFrom(net);
2013-07-28 04:32:41 +02:00
net.deregister();
}
}
register();
2013-07-28 04:32:41 +02:00
}
public static double round(double d)
{
return Math.round(d * 10000)/10000;
}
@Override
public void absorbBuffer(IGridTransmitter<EnergyAcceptorWrapper, EnergyNetwork> transmitter)
{
EnergyStack energy = (EnergyStack)transmitter.getBuffer();
buffer.amount += energy.amount;
energy.amount = 0;
}
@Override
public void clampBuffer()
{
if(buffer.amount > getCapacity())
{
buffer.amount = getCapacity();
}
}
@Override
protected void updateMeanCapacity()
{
int numCables = transmitters.size();
double reciprocalSum = 0;
for(IGridTransmitter<EnergyAcceptorWrapper, EnergyNetwork> cable : transmitters)
{
reciprocalSum += 1.0/(double)cable.getCapacity();
}
meanCapacity = (double)numCables / reciprocalSum;
}
public double getEnergyNeeded()
{
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
return 0;
}
return getCapacity()-buffer.amount;
}
public double tickEmit(double energyToSend)
2013-11-17 16:55:20 +01:00
{
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
return 0;
}
double sent = 0;
boolean tryAgain = false;
int i = 0;
do {
2014-08-08 05:48:22 +02:00
double prev = sent;
2014-08-09 19:29:04 +02:00
sent += doEmit(energyToSend-sent, tryAgain);
2014-08-08 05:48:22 +02:00
tryAgain = energyToSend-sent > 0 && sent-prev > 0 && i < 100;
i++;
} while(tryAgain);
joulesTransmitted = sent;
return sent;
2013-11-17 16:55:20 +01:00
}
public double emit(double energyToSend, boolean doEmit)
{
double toUse = Math.min(getEnergyNeeded(), energyToSend);
Update lots of APIs, most notably BC and an actual 1.7 version of CC Conflicts: build.properties src/api/java/buildcraft/api/core/BlockIndex.java src/api/java/buildcraft/api/core/BuildCraftAPI.java src/api/java/buildcraft/api/fuels/IFuel.java src/api/java/buildcraft/api/mj/BatteryObject.java src/api/java/buildcraft/api/mj/IBatteryIOObject.java src/api/java/buildcraft/api/mj/IBatteryObject.java src/api/java/buildcraft/api/mj/IOMode.java src/api/java/buildcraft/api/mj/MjAPI.java src/api/java/buildcraft/api/mj/MjBattery.java src/api/java/buildcraft/api/power/PowerHandler.java src/api/java/buildcraft/api/recipes/CraftingResult.java src/api/java/buildcraft/api/recipes/IAssemblyRecipeManager.java src/api/java/buildcraft/api/recipes/IFlexibleRecipe.java src/api/java/buildcraft/api/recipes/IRefineryRecipeManager.java src/api/java/buildcraft/api/transport/IPipe.java src/main/java/mekanism/common/CommonProxy.java src/main/java/mekanism/common/EnergyNetwork.java src/main/java/mekanism/common/FuelHandler.java src/main/java/mekanism/common/Mekanism.java src/main/java/mekanism/common/base/IAdvancedBoundingBlock.java src/main/java/mekanism/common/multipart/MultipartMekanism.java src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java src/main/java/mekanism/common/multipart/PartUniversalCable.java src/main/java/mekanism/common/network/PacketConfigSync.java src/main/java/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java src/main/java/mekanism/common/tile/TileEntityElectricBlock.java src/main/java/mekanism/common/util/CableUtils.java src/main/java/mekanism/common/util/MekanismUtils.java src/main/java/mekanism/common/util/TransporterUtils.java src/main/java/mekanism/generators/common/MekanismGenerators.java src/main/java/mekanism/generators/common/tile/TileEntityBioGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGasGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityHeatGenerator.java src/main/java/mekanism/generators/common/tile/TileEntitySolarGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityWindTurbine.java
2014-11-10 22:51:37 +01:00
if(doEmit)
{
buffer.amount += toUse;
Update lots of APIs, most notably BC and an actual 1.7 version of CC Conflicts: build.properties src/api/java/buildcraft/api/core/BlockIndex.java src/api/java/buildcraft/api/core/BuildCraftAPI.java src/api/java/buildcraft/api/fuels/IFuel.java src/api/java/buildcraft/api/mj/BatteryObject.java src/api/java/buildcraft/api/mj/IBatteryIOObject.java src/api/java/buildcraft/api/mj/IBatteryObject.java src/api/java/buildcraft/api/mj/IOMode.java src/api/java/buildcraft/api/mj/MjAPI.java src/api/java/buildcraft/api/mj/MjBattery.java src/api/java/buildcraft/api/power/PowerHandler.java src/api/java/buildcraft/api/recipes/CraftingResult.java src/api/java/buildcraft/api/recipes/IAssemblyRecipeManager.java src/api/java/buildcraft/api/recipes/IFlexibleRecipe.java src/api/java/buildcraft/api/recipes/IRefineryRecipeManager.java src/api/java/buildcraft/api/transport/IPipe.java src/main/java/mekanism/common/CommonProxy.java src/main/java/mekanism/common/EnergyNetwork.java src/main/java/mekanism/common/FuelHandler.java src/main/java/mekanism/common/Mekanism.java src/main/java/mekanism/common/base/IAdvancedBoundingBlock.java src/main/java/mekanism/common/multipart/MultipartMekanism.java src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java src/main/java/mekanism/common/multipart/PartUniversalCable.java src/main/java/mekanism/common/network/PacketConfigSync.java src/main/java/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java src/main/java/mekanism/common/tile/TileEntityElectricBlock.java src/main/java/mekanism/common/util/CableUtils.java src/main/java/mekanism/common/util/MekanismUtils.java src/main/java/mekanism/common/util/TransporterUtils.java src/main/java/mekanism/generators/common/MekanismGenerators.java src/main/java/mekanism/generators/common/tile/TileEntityBioGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGasGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityHeatGenerator.java src/main/java/mekanism/generators/common/tile/TileEntitySolarGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityWindTurbine.java
2014-11-10 22:51:37 +01:00
}
return energyToSend-toUse;
}
/**
* @return sent
*/
public double doEmit(double energyToSend, boolean tryAgain)
{
double sent = 0;
List availableAcceptors = Arrays.asList(getAcceptors(null).toArray());
Collections.shuffle(availableAcceptors);
if(!availableAcceptors.isEmpty())
{
int divider = availableAcceptors.size();
double remaining = energyToSend % divider;
double sending = (energyToSend-remaining)/divider;
for(Object obj : availableAcceptors)
{
if(obj instanceof TileEntity)
{
TileEntity acceptor = (TileEntity)obj;
double currentSending = sending+remaining;
EnumSet<ForgeDirection> sides = acceptorDirections.get(Coord4D.get(acceptor));
if(sides == null || sides.isEmpty())
2013-12-03 22:57:57 +01:00
{
continue;
}
for(ForgeDirection side : sides)
{
double prev = sent;
if(acceptor instanceof IStrictEnergyAcceptor)
{
sent += ((IStrictEnergyAcceptor)acceptor).transferEnergyToAcceptor(side.getOpposite(), currentSending);
}
Update lots of APIs, most notably BC and an actual 1.7 version of CC Conflicts: build.properties src/api/java/buildcraft/api/core/BlockIndex.java src/api/java/buildcraft/api/core/BuildCraftAPI.java src/api/java/buildcraft/api/fuels/IFuel.java src/api/java/buildcraft/api/mj/BatteryObject.java src/api/java/buildcraft/api/mj/IBatteryIOObject.java src/api/java/buildcraft/api/mj/IBatteryObject.java src/api/java/buildcraft/api/mj/IOMode.java src/api/java/buildcraft/api/mj/MjAPI.java src/api/java/buildcraft/api/mj/MjBattery.java src/api/java/buildcraft/api/power/PowerHandler.java src/api/java/buildcraft/api/recipes/CraftingResult.java src/api/java/buildcraft/api/recipes/IAssemblyRecipeManager.java src/api/java/buildcraft/api/recipes/IFlexibleRecipe.java src/api/java/buildcraft/api/recipes/IRefineryRecipeManager.java src/api/java/buildcraft/api/transport/IPipe.java src/main/java/mekanism/common/CommonProxy.java src/main/java/mekanism/common/EnergyNetwork.java src/main/java/mekanism/common/FuelHandler.java src/main/java/mekanism/common/Mekanism.java src/main/java/mekanism/common/base/IAdvancedBoundingBlock.java src/main/java/mekanism/common/multipart/MultipartMekanism.java src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java src/main/java/mekanism/common/multipart/PartUniversalCable.java src/main/java/mekanism/common/network/PacketConfigSync.java src/main/java/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java src/main/java/mekanism/common/tile/TileEntityElectricBlock.java src/main/java/mekanism/common/util/CableUtils.java src/main/java/mekanism/common/util/MekanismUtils.java src/main/java/mekanism/common/util/TransporterUtils.java src/main/java/mekanism/generators/common/MekanismGenerators.java src/main/java/mekanism/generators/common/tile/TileEntityBioGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGasGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityHeatGenerator.java src/main/java/mekanism/generators/common/tile/TileEntitySolarGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityWindTurbine.java
2014-11-10 22:51:37 +01:00
else if(MekanismUtils.useRF() && acceptor instanceof IEnergyReceiver)
{
Update lots of APIs, most notably BC and an actual 1.7 version of CC Conflicts: build.properties src/api/java/buildcraft/api/core/BlockIndex.java src/api/java/buildcraft/api/core/BuildCraftAPI.java src/api/java/buildcraft/api/fuels/IFuel.java src/api/java/buildcraft/api/mj/BatteryObject.java src/api/java/buildcraft/api/mj/IBatteryIOObject.java src/api/java/buildcraft/api/mj/IBatteryObject.java src/api/java/buildcraft/api/mj/IOMode.java src/api/java/buildcraft/api/mj/MjAPI.java src/api/java/buildcraft/api/mj/MjBattery.java src/api/java/buildcraft/api/power/PowerHandler.java src/api/java/buildcraft/api/recipes/CraftingResult.java src/api/java/buildcraft/api/recipes/IAssemblyRecipeManager.java src/api/java/buildcraft/api/recipes/IFlexibleRecipe.java src/api/java/buildcraft/api/recipes/IRefineryRecipeManager.java src/api/java/buildcraft/api/transport/IPipe.java src/main/java/mekanism/common/CommonProxy.java src/main/java/mekanism/common/EnergyNetwork.java src/main/java/mekanism/common/FuelHandler.java src/main/java/mekanism/common/Mekanism.java src/main/java/mekanism/common/base/IAdvancedBoundingBlock.java src/main/java/mekanism/common/multipart/MultipartMekanism.java src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java src/main/java/mekanism/common/multipart/PartUniversalCable.java src/main/java/mekanism/common/network/PacketConfigSync.java src/main/java/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java src/main/java/mekanism/common/tile/TileEntityElectricBlock.java src/main/java/mekanism/common/util/CableUtils.java src/main/java/mekanism/common/util/MekanismUtils.java src/main/java/mekanism/common/util/TransporterUtils.java src/main/java/mekanism/generators/common/MekanismGenerators.java src/main/java/mekanism/generators/common/tile/TileEntityBioGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGasGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityHeatGenerator.java src/main/java/mekanism/generators/common/tile/TileEntitySolarGenerator.java src/main/java/mekanism/generators/common/tile/TileEntityWindTurbine.java
2014-11-10 22:51:37 +01:00
IEnergyReceiver handler = (IEnergyReceiver)acceptor;
int used = handler.receiveEnergy(side.getOpposite(), (int)Math.round(currentSending*general.TO_TE), false);
sent += used*general.FROM_TE;
}
else if(MekanismUtils.useIC2() && acceptor instanceof IEnergySink)
{
double toSend = Math.min(currentSending, EnergyNet.instance.getPowerFromTier(((IEnergySink)acceptor).getSinkTier())*general.FROM_IC2);
toSend = Math.min(toSend, ((IEnergySink)acceptor).getDemandedEnergy()*general.FROM_IC2);
sent += (toSend - (((IEnergySink)acceptor).injectEnergy(side.getOpposite(), toSend*general.TO_IC2, 0)*general.FROM_IC2));
}
if(sent > prev)
{
break;
}
}
}
}
}
return sent;
}
2013-08-18 22:51:47 +02:00
@Override
public Set<EnergyAcceptorWrapper> getAcceptors(Object data)
{
Set<EnergyAcceptorWrapper> toReturn = new HashSet<>();
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
return toReturn;
}
for(Coord4D coord : possibleAcceptors.keySet())
{
EnumSet<ForgeDirection> sides = acceptorDirections.get(coord);
if(sides == null || sides.isEmpty())
{
continue;
}
TileEntity tile = coord.getTileEntity(getWorld());
EnergyAcceptorWrapper acceptor = EnergyAcceptorWrapper.get(tile);
if(acceptor != null)
{
for(ForgeDirection side : sides)
{
if(acceptor.canReceiveEnergy(side.getOpposite()) && acceptor.getNeeded() > 0)
{
toReturn.add(acceptor);
break;
}
}
}
}
return toReturn;
}
public static class EnergyTransferEvent extends Event
{
public final EnergyNetwork energyNetwork;
public final double power;
public EnergyTransferEvent(EnergyNetwork network, double currentPower)
{
energyNetwork = network;
power = currentPower;
}
}
@Override
public String toString()
{
return "[EnergyNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors.";
}
2013-08-18 22:51:47 +02:00
@Override
2013-12-21 20:54:12 +01:00
public void onUpdate()
{
2013-12-21 20:54:12 +01:00
super.onUpdate();
clearJoulesTransmitted();
double currentPowerScale = getPowerScale();
2013-11-03 22:54:33 +01:00
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
{
if(Math.abs(currentPowerScale-lastPowerScale) > 0.01 || (currentPowerScale != lastPowerScale && (currentPowerScale == 0 || currentPowerScale == 1)))
2013-11-03 22:54:33 +01:00
{
needsUpdate = true;
}
2013-11-03 22:54:33 +01:00
if(needsUpdate)
{
MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale));
lastPowerScale = currentPowerScale;
2013-11-03 22:54:33 +01:00
needsUpdate = false;
}
if(buffer.amount > 0)
{
buffer.amount -= tickEmit(buffer.amount);
}
}
}
public double getPowerScale()
{
return Math.max(jouleBufferLastTick == 0 ? 0 : Math.min(Math.ceil(Math.log10(getPower())*2)/10, 1), getCapacity() == 0 ? 0 : buffer.amount/getCapacity());
2013-07-28 04:32:41 +02:00
}
public void clearJoulesTransmitted()
{
jouleBufferLastTick = buffer.amount;
joulesTransmitted = 0;
}
public double getPower()
{
return jouleBufferLastTick * 20;
}
@Override
public String getNeededInfo()
{
return MekanismUtils.getEnergyDisplay(getEnergyNeeded());
}
@Override
public String getStoredInfo()
{
return MekanismUtils.getEnergyDisplay(buffer.amount);
}
@Override
public String getFlowInfo()
{
return MekanismUtils.getEnergyDisplay(joulesTransmitted) + "/t";
}
2013-07-28 04:32:41 +02:00
}