basic-components/src/main/java/universalelectricity/prefab/tile/ElectricTileDriver.java

105 lines
4.5 KiB
Java

package universalelectricity.prefab.tile;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import universalelectricity.api.CompatibilityModule;
import universalelectricity.core.electricity.ElectricityNetworkHelper;
import universalelectricity.core.electricity.ElectricityPack;
import universalelectricity.core.electricity.IElectricityNetwork;
import universalelectricity.core.vector.Vector3;
public class ElectricTileDriver {
TileEntity handler;
public ElectricTileDriver(TileEntity handler) {
this.handler = handler;
}
public void invalidate() {
ElectricityNetworkHelper.invalidate(handler);
}
public void tick() {
Map<ForgeDirection, IElectricityNetwork> networks = getNetworks();
Set<ForgeDirection> inputSides = new HashSet<>();
if (CompatibilityModule.canReceive(handler, ForgeDirection.UNKNOWN)) {
inputSides = consume(networks);
}
if (CompatibilityModule.canExtract(handler, ForgeDirection.UNKNOWN)) {
produce(networks, inputSides);
}
}
public Set<ForgeDirection> consume(Map<ForgeDirection, IElectricityNetwork> networks) {
Set<ForgeDirection> inputSides = new HashSet<>();
if (networks.size() > 0) {
double demand = CompatibilityModule.getDemandedJoules(handler);
double voltage = CompatibilityModule.getInputVoltage(handler);
double wattsPerSide = demand / networks.size();
for (ForgeDirection side : networks.keySet()) {
IElectricityNetwork net = networks.get(side);
if (CompatibilityModule.canReceive(handler, side) && wattsPerSide > 0 && demand > 0) {
inputSides.add(side);
net.startRequesting(handler, wattsPerSide / voltage, voltage);
ElectricityPack receivedPack = net.consumeElectricity(handler);
if (receivedPack.voltage > voltage) {
handler.getWorldObj().createExplosion(null, handler.xCoord, handler.yCoord, handler.zCoord, 1, true);
return EnumSet.allOf(ForgeDirection.class);
}
CompatibilityModule.receiveEnergy(handler, side, receivedPack.getWatts(), true);
} else {
net.stopRequesting(handler);
}
}
}
return inputSides;
}
public void produce(Map<ForgeDirection, IElectricityNetwork> networks, Set<ForgeDirection> inputSides) {
if ((networks.size() - inputSides.size()) > 0) {
double provided = CompatibilityModule.getProvidedJoules(handler);
double voltage = CompatibilityModule.getOutputVoltage(handler);
double wattsPerSide = provided / (networks.size() - inputSides.size());
for (ForgeDirection side : networks.keySet()) {
IElectricityNetwork net = networks.get(side);
if (!inputSides.contains(side) && CompatibilityModule.canExtract(handler, side) && wattsPerSide > 0 && provided > 0) {
double amperes = Math.min(wattsPerSide / voltage, net.getRequest(new TileEntity[]{handler}).amperes);
net.startProducing(handler, amperes, voltage);
CompatibilityModule.extractEnergy(handler, side, new ElectricityPack(amperes, voltage).getWatts(), true);
} else {
net.stopProducing(handler);
}
}
}
}
public Map<ForgeDirection, IElectricityNetwork> getNetworks() {
Map<ForgeDirection, IElectricityNetwork> networks = new HashMap<>();
for(ForgeDirection dir : ForgeDirection.values()) {
if (CompatibilityModule.canReceive(handler, dir) || CompatibilityModule.canExtract(handler, dir)) {
Vector3 position = new Vector3(handler);
position.modifyPositionFromSide(dir);
TileEntity outputConductor = position.getTileEntity(handler.getWorldObj());
IElectricityNetwork electricityNetwork = ElectricityNetworkHelper.getNetworkFromTileEntity(outputConductor, dir);
if(electricityNetwork != null && !networks.containsValue(electricityNetwork)) {
networks.put(dir, electricityNetwork);
}
}
}
return networks;
}
}