2013-06-24 18:24:04 +02:00
|
|
|
package mekanism.common;
|
|
|
|
|
|
|
|
import ic2.api.energy.tile.IEnergySink;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
2013-08-06 07:40:41 +02:00
|
|
|
import java.util.NoSuchElementException;
|
2013-06-24 18:24:04 +02:00
|
|
|
import java.util.Set;
|
|
|
|
|
2013-08-16 17:56:42 +02:00
|
|
|
import mekanism.api.DynamicNetwork;
|
2013-06-24 18:24:04 +02:00
|
|
|
import mekanism.api.IStrictEnergyAcceptor;
|
2013-08-04 02:18:43 +02:00
|
|
|
import mekanism.api.ITransmitterNetwork;
|
2013-06-24 18:24:04 +02:00
|
|
|
import mekanism.api.Object3D;
|
2013-08-04 02:18:43 +02:00
|
|
|
import mekanism.api.TransmitterNetworkRegistry;
|
2013-06-24 18:24:04 +02:00
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraftforge.common.ForgeDirection;
|
2013-08-04 02:48:13 +02:00
|
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
|
|
import net.minecraftforge.event.Event;
|
2013-06-24 18:24:04 +02:00
|
|
|
import net.minecraftforge.event.ForgeSubscribe;
|
|
|
|
import net.minecraftforge.event.world.ChunkEvent;
|
2013-08-16 17:56:42 +02:00
|
|
|
import universalelectricity.core.block.IElectrical;
|
|
|
|
import universalelectricity.core.electricity.ElectricityPack;
|
2013-06-24 18:24:04 +02:00
|
|
|
import buildcraft.api.power.IPowerReceptor;
|
2013-07-31 17:54:58 +02:00
|
|
|
import buildcraft.api.power.PowerHandler.PowerReceiver;
|
|
|
|
import buildcraft.api.power.PowerHandler.Type;
|
2013-08-16 17:56:42 +02:00
|
|
|
import cpw.mods.fml.common.FMLCommonHandler;
|
2013-06-24 18:24:04 +02:00
|
|
|
|
2013-08-16 17:56:42 +02:00
|
|
|
public class EnergyNetwork extends DynamicNetwork implements ITransmitterNetwork
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-28 04:32:41 +02:00
|
|
|
public HashSet<IUniversalCable> cables = new HashSet<IUniversalCable>();
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
public Set<TileEntity> possibleAcceptors = new HashSet<TileEntity>();
|
|
|
|
public Map<TileEntity, ForgeDirection> acceptorDirections = new HashMap<TileEntity, ForgeDirection>();
|
|
|
|
|
2013-08-04 02:48:13 +02:00
|
|
|
private double lastPowerScale = 0;
|
2013-07-05 18:54:22 +02:00
|
|
|
private double joulesTransmitted = 0;
|
|
|
|
private double joulesLastTick = 0;
|
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
public EnergyNetwork(IUniversalCable... varCables)
|
|
|
|
{
|
|
|
|
cables.addAll(Arrays.asList(varCables));
|
2013-08-04 02:41:16 +02:00
|
|
|
register();
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
public EnergyNetwork(Set<EnergyNetwork> networks)
|
|
|
|
{
|
2013-07-31 22:44:53 +02:00
|
|
|
for(EnergyNetwork net : networks)
|
2013-07-28 04:32:41 +02:00
|
|
|
{
|
|
|
|
if(net != null)
|
|
|
|
{
|
|
|
|
addAllCables(net.cables);
|
|
|
|
net.deregister();
|
|
|
|
}
|
|
|
|
}
|
2013-07-31 22:44:53 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
refresh();
|
2013-08-04 02:41:16 +02:00
|
|
|
register();
|
2013-07-28 04:32:41 +02:00
|
|
|
}
|
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
public double getEnergyNeeded(ArrayList<TileEntity> ignored)
|
|
|
|
{
|
|
|
|
double totalNeeded = 0;
|
|
|
|
|
|
|
|
for(TileEntity acceptor : getEnergyAcceptors())
|
|
|
|
{
|
|
|
|
if(!ignored.contains(acceptor))
|
|
|
|
{
|
|
|
|
if(acceptor instanceof IStrictEnergyAcceptor)
|
|
|
|
{
|
|
|
|
totalNeeded += (((IStrictEnergyAcceptor)acceptor).getMaxEnergy() - ((IStrictEnergyAcceptor)acceptor).getEnergy());
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IEnergySink)
|
|
|
|
{
|
|
|
|
totalNeeded += Math.min((((IEnergySink)acceptor).demandsEnergy()*Mekanism.FROM_IC2), (((IEnergySink)acceptor).getMaxSafeInput()*Mekanism.FROM_IC2));
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IPowerReceptor && Mekanism.hooks.BuildCraftLoaded)
|
|
|
|
{
|
2013-07-31 17:54:58 +02:00
|
|
|
totalNeeded += (((IPowerReceptor)acceptor).getPowerReceiver(acceptorDirections.get(acceptor).getOpposite()).powerRequest()*Mekanism.FROM_BC);
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
2013-08-04 05:02:06 +02:00
|
|
|
else if(acceptor instanceof IElectrical)
|
|
|
|
{
|
|
|
|
totalNeeded += ((IElectrical)acceptor).getRequest(acceptorDirections.get(acceptor))*Mekanism.FROM_UE;
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return totalNeeded;
|
|
|
|
}
|
|
|
|
|
|
|
|
public double emit(double energyToSend, ArrayList<TileEntity> ignored)
|
|
|
|
{
|
2013-07-05 18:54:22 +02:00
|
|
|
double energyAvailable = energyToSend;
|
2013-08-04 05:02:06 +02:00
|
|
|
double sent;
|
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
List availableAcceptors = Arrays.asList(getEnergyAcceptors().toArray());
|
2013-07-05 18:54:22 +02:00
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
Collections.shuffle(availableAcceptors);
|
2013-07-05 18:54:22 +02:00
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
if(!availableAcceptors.isEmpty())
|
|
|
|
{
|
|
|
|
int divider = availableAcceptors.size();
|
|
|
|
double remaining = energyToSend % divider;
|
|
|
|
double sending = (energyToSend-remaining)/divider;
|
2013-07-05 18:54:22 +02:00
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
for(Object obj : availableAcceptors)
|
|
|
|
{
|
2013-06-27 17:03:50 +02:00
|
|
|
if(obj instanceof TileEntity && !ignored.contains(obj))
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
TileEntity acceptor = (TileEntity)obj;
|
|
|
|
double currentSending = sending+remaining;
|
|
|
|
|
|
|
|
remaining = 0;
|
|
|
|
|
|
|
|
if(acceptor instanceof IStrictEnergyAcceptor)
|
|
|
|
{
|
|
|
|
energyToSend -= (currentSending - ((IStrictEnergyAcceptor)acceptor).transferEnergyToAcceptor(currentSending));
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IEnergySink)
|
|
|
|
{
|
|
|
|
double toSend = Math.min(currentSending, (((IEnergySink)acceptor).getMaxSafeInput()*Mekanism.FROM_IC2));
|
|
|
|
energyToSend -= (toSend - (((IEnergySink)acceptor).injectEnergy(MekanismUtils.toIC2Direction(acceptorDirections.get(acceptor).getOpposite()), (int)(toSend*Mekanism.TO_IC2))*Mekanism.FROM_IC2));
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IPowerReceptor && Mekanism.hooks.BuildCraftLoaded)
|
|
|
|
{
|
2013-07-31 17:54:58 +02:00
|
|
|
PowerReceiver receiver = ((IPowerReceptor)acceptor).getPowerReceiver(acceptorDirections.get(acceptor).getOpposite());
|
|
|
|
double electricityNeeded = Math.min(receiver.powerRequest(), receiver.getMaxEnergyStored() - receiver.getEnergyStored())*Mekanism.FROM_BC;
|
|
|
|
double transferEnergy = Math.min(electricityNeeded, currentSending);
|
|
|
|
receiver.receiveEnergy(Type.STORAGE, (float)(transferEnergy*Mekanism.TO_BC), acceptorDirections.get(acceptor).getOpposite());
|
|
|
|
energyToSend -= transferEnergy;
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
2013-08-04 05:02:06 +02:00
|
|
|
else if(acceptor instanceof IElectrical)
|
|
|
|
{
|
|
|
|
double toSend = Math.min(currentSending, ((IElectrical)acceptor).getRequest(acceptorDirections.get(acceptor).getOpposite())*Mekanism.FROM_UE);
|
|
|
|
ElectricityPack pack = ElectricityPack.getFromWatts((float)(toSend*Mekanism.TO_UE), ((IElectrical)acceptor).getVoltage());
|
|
|
|
energyToSend -= ((IElectrical)acceptor).receiveElectricity(acceptorDirections.get(acceptor).getOpposite(), pack, true)*Mekanism.FROM_UE;
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
2013-07-31 22:44:53 +02:00
|
|
|
|
2013-07-05 18:54:22 +02:00
|
|
|
sent = energyAvailable - energyToSend;
|
|
|
|
joulesTransmitted += sent;
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return energyToSend;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Set<TileEntity> getEnergyAcceptors()
|
|
|
|
{
|
|
|
|
Set<TileEntity> toReturn = new HashSet<TileEntity>();
|
|
|
|
|
|
|
|
for(TileEntity acceptor : possibleAcceptors)
|
|
|
|
{
|
|
|
|
if(acceptor instanceof IStrictEnergyAcceptor)
|
|
|
|
{
|
|
|
|
if(((IStrictEnergyAcceptor)acceptor).canReceiveEnergy(acceptorDirections.get(acceptor).getOpposite()))
|
|
|
|
{
|
|
|
|
if((((IStrictEnergyAcceptor)acceptor).getMaxEnergy() - ((IStrictEnergyAcceptor)acceptor).getEnergy()) > 0)
|
|
|
|
{
|
|
|
|
toReturn.add(acceptor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IEnergySink)
|
|
|
|
{
|
|
|
|
if(((IEnergySink)acceptor).acceptsEnergyFrom(null, MekanismUtils.toIC2Direction(acceptorDirections.get(acceptor)).getInverse()))
|
|
|
|
{
|
|
|
|
if(Math.min((((IEnergySink)acceptor).demandsEnergy()*Mekanism.FROM_IC2), (((IEnergySink)acceptor).getMaxSafeInput()*Mekanism.FROM_IC2)) > 0)
|
|
|
|
{
|
|
|
|
toReturn.add(acceptor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(acceptor instanceof IPowerReceptor && Mekanism.hooks.BuildCraftLoaded)
|
|
|
|
{
|
2013-07-31 17:54:58 +02:00
|
|
|
if(((IPowerReceptor)acceptor).getPowerReceiver(acceptorDirections.get(acceptor).getOpposite()) != null)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-31 17:54:58 +02:00
|
|
|
if((((IPowerReceptor)acceptor).getPowerReceiver(acceptorDirections.get(acceptor).getOpposite()).powerRequest()*Mekanism.FROM_BC) > 0)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
toReturn.add(acceptor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-08-04 05:02:06 +02:00
|
|
|
else if(acceptor instanceof IElectrical)
|
|
|
|
{
|
|
|
|
if(((IElectrical)acceptor).canConnect(acceptorDirections.get(acceptor).getOpposite()))
|
|
|
|
{
|
|
|
|
if(((IElectrical)acceptor).getRequest(acceptorDirections.get(acceptor).getOpposite()) > 0)
|
|
|
|
{
|
|
|
|
toReturn.add(acceptor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return toReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void refresh()
|
|
|
|
{
|
2013-07-28 04:32:41 +02:00
|
|
|
Set<IUniversalCable> iterCables = (Set<IUniversalCable>) cables.clone();
|
|
|
|
Iterator<IUniversalCable> it = iterCables.iterator();
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
possibleAcceptors.clear();
|
|
|
|
acceptorDirections.clear();
|
|
|
|
|
|
|
|
while(it.hasNext())
|
|
|
|
{
|
|
|
|
IUniversalCable conductor = (IUniversalCable)it.next();
|
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
if(conductor == null || ((TileEntity)conductor).isInvalid())
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
it.remove();
|
2013-07-28 04:32:41 +02:00
|
|
|
cables.remove(conductor);
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
conductor.setNetwork(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
for(IUniversalCable cable : iterCables)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
TileEntity[] acceptors = CableUtils.getConnectedEnergyAcceptors((TileEntity)cable);
|
|
|
|
|
|
|
|
for(TileEntity acceptor : acceptors)
|
|
|
|
{
|
|
|
|
if(acceptor != null && !(acceptor instanceof IUniversalCable))
|
|
|
|
{
|
|
|
|
possibleAcceptors.add(acceptor);
|
|
|
|
acceptorDirections.put(acceptor, ForgeDirection.getOrientation(Arrays.asList(acceptors).indexOf(acceptor)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-08-04 02:48:13 +02:00
|
|
|
|
|
|
|
double currentPowerScale = getPowerScale();
|
|
|
|
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
|
|
|
|
{
|
|
|
|
lastPowerScale = currentPowerScale;
|
|
|
|
|
|
|
|
MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale));
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void merge(EnergyNetwork network)
|
|
|
|
{
|
|
|
|
if(network != null && network != this)
|
|
|
|
{
|
2013-08-04 02:41:16 +02:00
|
|
|
Set<EnergyNetwork> networks = new HashSet<EnergyNetwork>();
|
2013-07-28 04:32:41 +02:00
|
|
|
networks.add(this);
|
|
|
|
networks.add(network);
|
|
|
|
EnergyNetwork newNetwork = new EnergyNetwork(networks);
|
2013-06-24 18:24:04 +02:00
|
|
|
newNetwork.refresh();
|
|
|
|
}
|
|
|
|
}
|
2013-07-28 04:32:41 +02:00
|
|
|
|
|
|
|
public void addAllCables(Set<IUniversalCable> newCables)
|
|
|
|
{
|
|
|
|
cables.addAll(newCables);
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
public void split(IUniversalCable splitPoint)
|
|
|
|
{
|
|
|
|
if(splitPoint instanceof TileEntity)
|
|
|
|
{
|
2013-07-28 04:32:41 +02:00
|
|
|
removeCable(splitPoint);
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
TileEntity[] connectedBlocks = new TileEntity[6];
|
2013-07-06 03:42:41 +02:00
|
|
|
boolean[] dealtWith = {false, false, false, false, false, false};
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)
|
|
|
|
{
|
|
|
|
TileEntity sideTile = Object3D.get((TileEntity)splitPoint).getFromSide(direction).getTileEntity(((TileEntity)splitPoint).worldObj);
|
|
|
|
|
|
|
|
if(sideTile != null)
|
|
|
|
{
|
|
|
|
connectedBlocks[Arrays.asList(ForgeDirection.values()).indexOf(direction)] = sideTile;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for(int countOne = 0; countOne < connectedBlocks.length; countOne++)
|
|
|
|
{
|
|
|
|
TileEntity connectedBlockA = connectedBlocks[countOne];
|
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
if(connectedBlockA instanceof IUniversalCable && !dealtWith[countOne])
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-06 03:42:41 +02:00
|
|
|
NetworkFinder finder = new NetworkFinder(((TileEntity)splitPoint).worldObj, Object3D.get(connectedBlockA), Object3D.get((TileEntity)splitPoint));
|
2013-07-28 04:32:41 +02:00
|
|
|
List<Object3D> partNetwork = finder.exploreNetwork();
|
2013-07-07 19:07:40 +02:00
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
for(int countTwo = countOne + 1; countTwo < connectedBlocks.length; countTwo++)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
TileEntity connectedBlockB = connectedBlocks[countTwo];
|
2013-07-07 19:07:40 +02:00
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
if(connectedBlockB instanceof IUniversalCable && !dealtWith[countTwo])
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-07 19:07:40 +02:00
|
|
|
if(partNetwork.contains(Object3D.get(connectedBlockB)))
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-06 03:42:41 +02:00
|
|
|
dealtWith[countTwo] = true;
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
2013-07-06 03:42:41 +02:00
|
|
|
}
|
|
|
|
}
|
2013-07-07 19:07:40 +02:00
|
|
|
|
2013-08-04 02:41:16 +02:00
|
|
|
Set<IUniversalCable> newNetCables= new HashSet<IUniversalCable>();
|
2013-07-06 03:42:41 +02:00
|
|
|
for(Object3D node : finder.iterated)
|
|
|
|
{
|
|
|
|
TileEntity nodeTile = node.getTileEntity(((TileEntity)splitPoint).worldObj);
|
2013-06-24 18:24:04 +02:00
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
if(nodeTile instanceof IUniversalCable)
|
|
|
|
{
|
|
|
|
if(nodeTile != splitPoint)
|
|
|
|
{
|
2013-08-04 02:41:16 +02:00
|
|
|
newNetCables.add((IUniversalCable)nodeTile);
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
2013-07-06 03:43:59 +02:00
|
|
|
}
|
2013-07-07 19:07:40 +02:00
|
|
|
|
2013-08-04 02:41:16 +02:00
|
|
|
EnergyNetwork newNetwork = new EnergyNetwork(newNetCables.toArray(new IUniversalCable[0]));
|
2013-07-06 03:42:41 +02:00
|
|
|
newNetwork.refresh();
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
2013-07-07 19:07:40 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
deregister();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void fixMessedUpNetwork(IUniversalCable cable)
|
|
|
|
{
|
|
|
|
if(cable instanceof TileEntity)
|
|
|
|
{
|
2013-07-31 22:44:53 +02:00
|
|
|
NetworkFinder finder = new NetworkFinder(((TileEntity)cable).getWorldObj(), Object3D.get((TileEntity)cable), null);
|
2013-07-28 04:32:41 +02:00
|
|
|
List<Object3D> partNetwork = finder.exploreNetwork();
|
|
|
|
Set<IUniversalCable> newCables = new HashSet<IUniversalCable>();
|
2013-07-31 22:44:53 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
for(Object3D node : partNetwork)
|
|
|
|
{
|
|
|
|
TileEntity nodeTile = node.getTileEntity(((TileEntity)cable).worldObj);
|
|
|
|
|
|
|
|
if(nodeTile instanceof IUniversalCable)
|
|
|
|
{
|
2013-08-04 05:02:06 +02:00
|
|
|
((IUniversalCable)nodeTile).removeFromNetwork();
|
2013-07-28 04:32:41 +02:00
|
|
|
newCables.add((IUniversalCable)nodeTile);
|
|
|
|
}
|
|
|
|
}
|
2013-07-31 22:44:53 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
EnergyNetwork newNetwork = new EnergyNetwork(newCables.toArray(new IUniversalCable[0]));
|
|
|
|
newNetwork.refresh();
|
|
|
|
newNetwork.fixed = true;
|
|
|
|
deregister();
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
public void removeCable(IUniversalCable cable)
|
|
|
|
{
|
|
|
|
cables.remove(cable);
|
2013-08-04 05:02:06 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
if(cables.size() == 0)
|
|
|
|
{
|
|
|
|
deregister();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-04 02:41:16 +02:00
|
|
|
public void register()
|
|
|
|
{
|
2013-08-06 07:40:41 +02:00
|
|
|
try {
|
|
|
|
IUniversalCable aCable = cables.iterator().next();
|
|
|
|
|
|
|
|
if(aCable instanceof TileEntity && !((TileEntity)aCable).worldObj.isRemote)
|
|
|
|
{
|
|
|
|
TransmitterNetworkRegistry.getInstance().registerNetwork(this);
|
|
|
|
}
|
|
|
|
} catch(NoSuchElementException e) {}
|
2013-08-04 02:41:16 +02:00
|
|
|
}
|
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
public void deregister()
|
|
|
|
{
|
|
|
|
cables.clear();
|
2013-08-04 02:41:16 +02:00
|
|
|
TransmitterNetworkRegistry.getInstance().removeNetwork(this);
|
2013-07-28 04:32:41 +02:00
|
|
|
}
|
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
public static class NetworkFinder
|
|
|
|
{
|
|
|
|
public World worldObj;
|
2013-07-06 03:42:41 +02:00
|
|
|
public Object3D start;
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
public List<Object3D> iterated = new ArrayList<Object3D>();
|
|
|
|
public List<Object3D> toIgnore = new ArrayList<Object3D>();
|
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
public NetworkFinder(World world, Object3D location, Object3D... ignore)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
|
|
|
worldObj = world;
|
2013-07-06 03:42:41 +02:00
|
|
|
start = location;
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
if(ignore != null)
|
|
|
|
{
|
|
|
|
toIgnore = Arrays.asList(ignore);
|
|
|
|
}
|
|
|
|
}
|
2013-07-06 03:42:41 +02:00
|
|
|
|
|
|
|
public void loopAll(Object3D location)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-06-29 23:24:54 +02:00
|
|
|
if(location.getTileEntity(worldObj) instanceof IUniversalCable)
|
2013-06-26 23:49:47 +02:00
|
|
|
{
|
|
|
|
iterated.add(location);
|
|
|
|
}
|
2013-06-24 18:24:04 +02:00
|
|
|
|
|
|
|
for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)
|
|
|
|
{
|
|
|
|
Object3D obj = location.getFromSide(direction);
|
|
|
|
|
|
|
|
if(!iterated.contains(obj) && !toIgnore.contains(obj))
|
|
|
|
{
|
|
|
|
TileEntity tileEntity = obj.getTileEntity(worldObj);
|
|
|
|
|
2013-06-29 23:24:54 +02:00
|
|
|
if(tileEntity instanceof IUniversalCable)
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-06 03:42:41 +02:00
|
|
|
loopAll(obj);
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-07-06 03:42:41 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
public List<Object3D> exploreNetwork()
|
2013-06-24 18:24:04 +02:00
|
|
|
{
|
2013-07-06 03:42:41 +02:00
|
|
|
loopAll(start);
|
2013-06-24 18:24:04 +02:00
|
|
|
|
2013-07-06 03:42:41 +02:00
|
|
|
return iterated;
|
2013-06-24 18:24:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-04 02:48:13 +02:00
|
|
|
public static class EnergyTransferEvent extends Event
|
|
|
|
{
|
|
|
|
public final EnergyNetwork energyNetwork;
|
|
|
|
|
|
|
|
public final double power;
|
|
|
|
|
|
|
|
public EnergyTransferEvent(EnergyNetwork network, double currentPower)
|
|
|
|
{
|
|
|
|
energyNetwork = network;
|
|
|
|
power = currentPower;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
public static class NetworkLoader
|
|
|
|
{
|
|
|
|
@ForgeSubscribe
|
|
|
|
public void onChunkLoad(ChunkEvent.Load event)
|
|
|
|
{
|
|
|
|
if(event.getChunk() != null)
|
|
|
|
{
|
|
|
|
for(Object obj : event.getChunk().chunkTileEntityMap.values())
|
|
|
|
{
|
|
|
|
if(obj instanceof TileEntity)
|
|
|
|
{
|
|
|
|
TileEntity tileEntity = (TileEntity)obj;
|
|
|
|
|
|
|
|
if(tileEntity instanceof IUniversalCable)
|
|
|
|
{
|
|
|
|
((IUniversalCable)tileEntity).refreshNetwork();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-07-05 18:54:22 +02:00
|
|
|
|
2013-06-24 18:24:04 +02:00
|
|
|
@Override
|
|
|
|
public String toString()
|
|
|
|
{
|
|
|
|
return "[EnergyNetwork] " + cables.size() + " cables, " + possibleAcceptors.size() + " acceptors.";
|
|
|
|
}
|
2013-07-05 18:54:22 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
public void tick()
|
|
|
|
{
|
|
|
|
clearJoulesTransmitted();
|
2013-07-31 22:44:53 +02:00
|
|
|
|
2013-07-28 04:32:41 +02:00
|
|
|
//Fix weird behaviour periodically.
|
|
|
|
if(!fixed)
|
|
|
|
{
|
|
|
|
++ticksSinceCreate;
|
|
|
|
if(ticksSinceCreate > 1200)
|
|
|
|
{
|
|
|
|
ticksSinceCreate = 0;
|
2013-08-04 02:41:16 +02:00
|
|
|
fixMessedUpNetwork(cables.iterator().next());
|
2013-07-28 04:32:41 +02:00
|
|
|
}
|
|
|
|
}
|
2013-08-04 02:48:13 +02:00
|
|
|
|
|
|
|
double currentPowerScale = getPowerScale();
|
|
|
|
if(currentPowerScale != lastPowerScale && FMLCommonHandler.instance().getEffectiveSide().isServer())
|
|
|
|
{
|
|
|
|
lastPowerScale = currentPowerScale;
|
|
|
|
|
|
|
|
MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public double getPowerScale()
|
|
|
|
{
|
|
|
|
return joulesLastTick == 0 ? 0 : Math.min(Math.ceil(Math.log10(getPower())*2)/10, 1);
|
2013-07-28 04:32:41 +02:00
|
|
|
}
|
|
|
|
|
2013-07-06 03:43:59 +02:00
|
|
|
public void clearJoulesTransmitted()
|
2013-07-05 18:54:22 +02:00
|
|
|
{
|
|
|
|
joulesLastTick = joulesTransmitted;
|
|
|
|
joulesTransmitted = 0;
|
|
|
|
}
|
2013-07-06 03:43:59 +02:00
|
|
|
|
|
|
|
public double getPower()
|
2013-07-05 18:54:22 +02:00
|
|
|
{
|
2013-07-28 21:49:11 +02:00
|
|
|
return joulesLastTick * 20;
|
2013-07-05 18:54:22 +02:00
|
|
|
}
|
2013-08-04 02:18:43 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getSize()
|
|
|
|
{
|
|
|
|
return cables.size();
|
|
|
|
}
|
2013-07-28 04:32:41 +02:00
|
|
|
}
|