diff --git a/common/universalelectricity/core/electricity/ElectricalEvent.java b/common/universalelectricity/core/electricity/ElectricalEvent.java index 35b9a2962..c71a5ea27 100644 --- a/common/universalelectricity/core/electricity/ElectricalEvent.java +++ b/common/universalelectricity/core/electricity/ElectricalEvent.java @@ -5,6 +5,7 @@ import net.minecraft.world.World; import net.minecraftforge.event.Cancelable; import net.minecraftforge.event.Event; import universalelectricity.core.block.IElectrical; +import universalelectricity.core.grid.IElectricityNetwork; public class ElectricalEvent extends Event { @@ -27,34 +28,40 @@ public class ElectricalEvent extends Event } } + public static class NetworkEvent extends ElectricalEvent + { + public final IElectricityNetwork network; + public ElectricityPack electricityPack; + public TileEntity[] ignoreTiles; + + public NetworkEvent(IElectricityNetwork network, ElectricityPack electricityPack, TileEntity... ignoreTiles) + { + this.network = network; + this.electricityPack = electricityPack; + this.ignoreTiles = ignoreTiles; + } + } + /** - * Internal Events + * Internal Events. These events are fired when something happens in the network. * * @author Calclavia * */ @Cancelable - public static class ElectricityProductionEvent extends ElectricalEvent + public static class ElectricityProductionEvent extends NetworkEvent { - public ElectricityPack electricityPack; - public TileEntity[] ignoreTiles; - - public ElectricityProductionEvent(ElectricityPack electricityPack, TileEntity... ignoreTiles) + public ElectricityProductionEvent(IElectricityNetwork network, ElectricityPack electricityPack, TileEntity... ignoreTiles) { - this.electricityPack = electricityPack; - this.ignoreTiles = ignoreTiles; + super(network, electricityPack, ignoreTiles); } } - public static class ElectricityRequestEvent extends ElectricalEvent + public static class ElectricityRequestEvent extends NetworkEvent { - public ElectricityPack electricityPack; - public TileEntity[] ignoreTiles; - - public ElectricityRequestEvent(ElectricityPack electricityPack, TileEntity... ignoreTiles) + public ElectricityRequestEvent(IElectricityNetwork network, ElectricityPack electricityPack, TileEntity... ignoreTiles) { - this.electricityPack = electricityPack; - this.ignoreTiles = ignoreTiles; + super(network, electricityPack, ignoreTiles); } } diff --git a/common/universalelectricity/core/electricity/ElectricityHelper.java b/common/universalelectricity/core/electricity/ElectricityHelper.java index e8b8b7eb8..8eb45ee00 100644 --- a/common/universalelectricity/core/electricity/ElectricityHelper.java +++ b/common/universalelectricity/core/electricity/ElectricityHelper.java @@ -23,56 +23,6 @@ import universalelectricity.core.vector.VectorHelper; */ public class ElectricityHelper { - @ForgeSubscribe - public void onProduce(ElectricityProduceEvent evt) - { - // Needs work with shuffling to be able to evenly distribute to all - // connected networks - // instead of just defaulting to one of them. - Vector3 position = new Vector3((TileEntity) evt.tileEntity); - HashMap networks = new HashMap(); - - for (ForgeDirection direction : getDirections((TileEntity) evt.tileEntity)) - { - IElectricityNetwork network = getNetworkFromTileEntity(VectorHelper.getTileEntityFromSide(evt.world, position, direction), direction.getOpposite()); - - if (network != null) - { - networks.put(network, direction); - ElectricityPack provided = evt.tileEntity.provideElectricity(direction, network.getRequest((TileEntity) evt.tileEntity), true); - - if (provided != null && provided.getWatts() > 0) - { - network.produce(provided, (TileEntity) evt.tileEntity); - } - } - } - - /* - * ElectricityPack request = this.getNetwork().getRequest(this); - * - * if (request.getWatts() > 0) { List providedPacks = new - * ArrayList(); List tileEntities = new - * ArrayList(); - * - * for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { Vector3 position = new - * Vector3(this).modifyPositionFromSide(direction); TileEntity tileEntity = - * position.getTileEntity(this.worldObj); - * - * if (tileEntity instanceof IElectrical) { tileEntities.add(tileEntity); IElectrical - * electrical = (IElectrical) tileEntity; - * - * if (electrical.canConnect(direction.getOpposite())) { if - * (electrical.getProvide(direction.getOpposite()) > 0) { providedPacks.add - * (electrical.provideElectricity(direction.getOpposite(), request, true)); } } } } - * - * ElectricityPack mergedPack = ElectricityPack.merge(providedPacks); - * - * if (mergedPack.getWatts() > 0) { this.getNetwork().produce(mergedPack, - * tileEntities.toArray(new TileEntity[0])); } } - */ - } - public static EnumSet getDirections(TileEntity tileEntity) { EnumSet possibleSides = EnumSet.noneOf(ForgeDirection.class); diff --git a/common/universalelectricity/core/grid/ElectricityNetwork.java b/common/universalelectricity/core/grid/ElectricityNetwork.java index ef695f125..4abd1cc77 100644 --- a/common/universalelectricity/core/grid/ElectricityNetwork.java +++ b/common/universalelectricity/core/grid/ElectricityNetwork.java @@ -42,14 +42,20 @@ public class ElectricityNetwork implements IElectricityNetwork private final Set conductors = new HashSet(); + public float acceptorResistance = 500; + @Override public float produce(ElectricityPack electricity, TileEntity... ignoreTiles) { - ElectricityProductionEvent evt = new ElectricityProductionEvent(electricity, ignoreTiles); + ElectricityProductionEvent evt = new ElectricityProductionEvent(this, electricity, ignoreTiles); MinecraftForge.EVENT_BUS.post(evt); - float energy = electricity.getWatts(); - float totalEnergy = energy; + float totalEnergy = electricity.getWatts(); + float networkResistance = getTotalResistance(); + float proportionWasted = getTotalResistance() / (getTotalResistance() + acceptorResistance); + float energyWasted = totalEnergy * proportionWasted; + float totalUsableEnergy = totalEnergy - energyWasted; + float remainingUsableEnergy = totalUsableEnergy; float voltage = electricity.voltage; if (!evt.isCanceled()) @@ -72,19 +78,13 @@ public class ElectricityNetwork implements IElectricityNetwork { if (electricalTile.canConnect(direction) && this.getConductors().contains(VectorHelper.getConnectorFromSide(tileEntity.worldObj, new Vector3(tileEntity), direction))) { - float energyToSend = totalEnergy * (electricalTile.getRequest(direction) / totalEnergyRequest); + float energyToSend = totalUsableEnergy * (electricalTile.getRequest(direction) / totalEnergyRequest); if (energyToSend > 0) { ElectricityPack electricityToSend = ElectricityPack.getFromWatts(energyToSend, voltage); - // Calculate energy loss caused by resistance. - float ampsReceived = electricityToSend.amperes - (electricityToSend.amperes * electricityToSend.amperes * this.getTotalResistance()) / electricityToSend.voltage; - float voltsReceived = electricityToSend.voltage - (electricityToSend.amperes * this.getTotalResistance()); - - electricityToSend = new ElectricityPack(ampsReceived, voltsReceived); - - energy -= ((IElectrical) tileEntity).receiveElectricity(direction, electricityToSend, true); + remainingUsableEnergy -= ((IElectrical) tileEntity).receiveElectricity(direction, electricityToSend, true); } } } @@ -94,7 +94,7 @@ public class ElectricityNetwork implements IElectricityNetwork } } - return energy; + return remainingUsableEnergy; } /** @@ -136,7 +136,7 @@ public class ElectricityNetwork implements IElectricityNetwork } ElectricityPack mergedPack = ElectricityPack.merge(requests); - ElectricityRequestEvent evt = new ElectricityRequestEvent(mergedPack, ignoreTiles); + ElectricityRequestEvent evt = new ElectricityRequestEvent(this, mergedPack, ignoreTiles); MinecraftForge.EVENT_BUS.post(evt); return mergedPack; }