This commit is contained in:
DarkGuardsman 2013-07-06 00:45:50 -04:00
parent d4cdd93130
commit cb320b6115
3 changed files with 96 additions and 26 deletions

View file

@ -26,6 +26,12 @@ public class NetworkPowerTiles extends NetworkTileEntities implements IElectrici
super(conductors);
}
@Override
public NetworkTileEntities newInstance()
{
return new NetworkPowerTiles();
}
@Override
public void startProducing(TileEntity tileEntity, ElectricityPack electricityPack)
{
@ -320,4 +326,5 @@ public class NetworkPowerTiles extends NetworkTileEntities implements IElectrici
{
}
}

View file

@ -15,7 +15,7 @@ import cpw.mods.fml.common.FMLLog;
import dark.core.api.INetworkPart;
import dark.helpers.ConnectionHelper;
public class NetworkTileEntities
public abstract class NetworkTileEntities
{
/* BLOCK THAT ACT AS FLUID CONVEYORS ** */
public final List<INetworkPart> networkMember = new ArrayList<INetworkPart>();
@ -25,29 +25,31 @@ public class NetworkTileEntities
this.networkMember.addAll(Arrays.asList(parts));
}
/** Adds a TileEntity to the network
/** Creates a new instance of this network to be used to merge or split networks while still
* maintaining each class that extends the base network class
*
* @param ent - tileEntity instance
* @return - new network instance using the current networks properties */
public abstract NetworkTileEntities newInstance();
/** Adds a TileEntity to the network. extends this to catch non-network parts and add them to
* other tile lists
*
* @param tileEntity - tileEntity instance
* @param member - add to network member list
* @return */
public boolean addEntity(TileEntity ent, boolean member)
public boolean addTile(TileEntity tileEntity, boolean member)
{
if (ent == null || this.isPartOfNetwork(ent))
if (tileEntity == null || this.isPartOfNetwork(tileEntity))
{
return false;
}
else if (ent instanceof INetworkPart && member)
else if (tileEntity instanceof INetworkPart && member)
{
return this.addNetworkPart((INetworkPart) ent);
return this.addNetworkPart((INetworkPart) tileEntity);
}
return false;
}
public boolean isPartOfNetwork(TileEntity ent)
{
return this.networkMember.contains(ent);
}
/** Adds a new part to the network member list */
public boolean addNetworkPart(INetworkPart part)
{
@ -61,6 +63,11 @@ public class NetworkTileEntities
return false;
}
public boolean isPartOfNetwork(TileEntity ent)
{
return this.networkMember.contains(ent);
}
/** Removes a tileEntity from any of the valid lists */
public void removeEntity(TileEntity ent)
{
@ -131,24 +138,34 @@ public class NetworkTileEntities
{
if (this.preMergeProcessing(network, part))
{
this.postMergeProcessing(network);
this.mergeDo(network);
}
}
}
/** Processing that needs too be done before the network merges
/** Processing that needs too be done before the network merges. Use this to do final network
* merge calculations and to cause network merge failure
*
* @return false if the merge needs to be canceled */
* @param network the network that is to merge with this one
* @param part the part at which started the network merge. Use this to cause damage if two
* networks merge with real world style failures
*
* @return false if the merge needs to be canceled.
*
* Cases in which the network should fail to merge are were the two networks merge with error.
* Or, in the case of pipes the two networks merge and the merge point was destroyed by
* combination of liquids.
*
* Ex Lava and water */
public boolean preMergeProcessing(NetworkTileEntities network, INetworkPart part)
{
return true;
}
/** Finalizing the merge of two networks by creating the new network and importing all network
* parts */
public void postMergeProcessing(NetworkTileEntities network)
/** Merges the two networks together */
protected void mergeDo(NetworkTileEntities network)
{
NetworkTileEntities newNetwork = new NetworkTileEntities();
NetworkTileEntities newNetwork = this.newInstance();
newNetwork.getNetworkMemebers().addAll(this.getNetworkMemebers());
newNetwork.getNetworkMemebers().addAll(network.getNetworkMemebers());
@ -199,7 +216,7 @@ public class NetworkTileEntities
else
{
/* NO LONGER CONNECTED ELSE WHERE SO SPLIT AND REFRESH */
NetworkTileEntities newNetwork = new NetworkTileEntities();
NetworkTileEntities newNetwork = this.newInstance();
int parts = 0;
for (Vector3 node : finder.closedSet)
{
@ -226,9 +243,12 @@ public class NetworkTileEntities
@Override
public String toString()
{
return "TileNetwork[" + this.hashCode() + "|parts:" + this.networkMember.size() + "]";
return "TileNetwork[" + this.hashCode() + "| Parts:" + this.networkMember.size() + "]";
}
/** invalidates/remove a tile from the networks that surround and connect to it
*
* @param tileEntity - tile */
public static void invalidate(TileEntity tileEntity)
{
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)

View file

@ -1,9 +1,11 @@
package dark.library.machine;
import java.util.EnumSet;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary;
import universalelectricity.core.UniversalElectricity;
@ -11,12 +13,14 @@ import universalelectricity.core.block.IConnector;
import universalelectricity.core.block.IVoltage;
import universalelectricity.core.electricity.ElectricityNetworkHelper;
import universalelectricity.core.electricity.ElectricityPack;
import universalelectricity.core.electricity.IElectricityNetwork;
import universalelectricity.prefab.tile.TileEntityElectrical;
import universalelectricity.prefab.tile.TileEntityElectricityRunnable;
import buildcraft.api.power.IPowerProvider;
import buildcraft.api.power.IPowerReceptor;
import buildcraft.api.power.PowerFramework;
import dark.core.PowerSystems;
import dark.core.api.INetworkPart;
public abstract class TileEntityRunnableMachine extends TileEntityElectrical implements IPowerReceptor, IConnector, IVoltage
{
@ -54,7 +58,7 @@ public abstract class TileEntityRunnableMachine extends TileEntityElectrical imp
// UNIVERSAL ELECTRICITY UPDATE
if (!this.isDisabled())
{
ElectricityPack electricityPack = ElectricityNetworkHelper.consumeFromMultipleSides(this, this.getConsumingSides(), ElectricityPack.getFromWatts(this.getRequest(ForgeDirection.UNKNOWN), this.getVoltage()));
ElectricityPack electricityPack = TileEntityRunnableMachine.consumeFromMultipleSides(this, this.getConsumingSides(), ElectricityPack.getFromWatts(this.getRequest(ForgeDirection.UNKNOWN), this.getVoltage()));
this.onReceive(ForgeDirection.UNKNOWN, electricityPack.voltage, electricityPack.amperes);
}
else
@ -74,7 +78,7 @@ public abstract class TileEntityRunnableMachine extends TileEntityElectrical imp
if (this.powerProvider != null)
{
float requiredEnergy = (float) (this.getRequest(ForgeDirection.UNKNOWN) * UniversalElectricity.TO_BC_RATIO);
float energyReceived = this.powerProvider.useEnergy(0, requiredEnergy, true);
float energyReceived = this.powerProvider.useEnergy(requiredEnergy, requiredEnergy, true);
this.onReceive(ForgeDirection.UNKNOWN, this.getVoltage(), (UniversalElectricity.BC3_RATIO * energyReceived) / this.getVoltage());
}
//TODO add other power systems
@ -170,4 +174,43 @@ public abstract class TileEntityRunnableMachine extends TileEntityElectrical imp
nbt.setBoolean("shouldPower", this.runPowerless);
nbt.setInteger("disabledTicks", this.disabledTicks);
}
public static ElectricityPack consumeFromMultipleSides(TileEntity tileEntity, EnumSet<ForgeDirection> approachingDirection, ElectricityPack requestPack)
{
ElectricityPack consumedPack = new ElectricityPack();
if (tileEntity != null && approachingDirection != null)
{
final List<IElectricityNetwork> connectedNetworks = ElectricityNetworkHelper.getNetworksFromMultipleSides(tileEntity, approachingDirection);
if (connectedNetworks.size() > 0)
{
/** Requests an even amount of electricity from all sides. */
double wattsPerSide = (requestPack.getWatts() / connectedNetworks.size());
double voltage = requestPack.voltage;
for (IElectricityNetwork network : connectedNetworks)
{
boolean flag = false;
if (tileEntity instanceof INetworkPart && ((INetworkPart) tileEntity).getTileNetwork() instanceof IElectricityNetwork)
{
flag = network.equals(((IElectricityNetwork) ((INetworkPart) tileEntity).getTileNetwork()));
}
if (!flag && wattsPerSide > 0 && requestPack.getWatts() > 0)
{
network.startRequesting(tileEntity, wattsPerSide / voltage, voltage);
ElectricityPack receivedPack = network.consumeElectricity(tileEntity);
consumedPack.amperes += receivedPack.amperes;
consumedPack.voltage = Math.max(consumedPack.voltage, receivedPack.voltage);
}
else
{
network.stopRequesting(tileEntity);
}
}
}
}
return consumedPack;
}
}