package universalelectricity.prefab.tile; import java.util.EnumSet; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import universalelectricity.core.block.IElectrical; import universalelectricity.core.block.IElectricalStorage; import universalelectricity.core.electricity.ElectricityHelper; import universalelectricity.core.electricity.ElectricityPack; import universalelectricity.core.grid.IElectricityNetwork; import universalelectricity.core.item.ElectricItemHelper; import universalelectricity.core.vector.Vector3; import universalelectricity.core.vector.VectorHelper; public abstract class TileEntityElectrical extends TileEntityAdvanced implements IElectrical, IElectricalStorage { public float energyStored = 0; /** * Recharges electric item. */ public void recharge(ItemStack itemStack) { this.setEnergyStored(this.getEnergyStored() - ElectricItemHelper.chargeItem(itemStack, this.getProvide(ForgeDirection.UNKNOWN))); } /** * Discharges electric item. */ public void discharge(ItemStack itemStack) { this.setEnergyStored(this.getEnergyStored() + ElectricItemHelper.dischargeItem(itemStack, this.getRequest(ForgeDirection.UNKNOWN))); } /** * Called to produce the potential electricity inside this block. */ public void produce() { if (!this.worldObj.isRemote) { for (ForgeDirection outputDirection : this.getOutputDirections()) { this.produceUE(outputDirection); } } } /** * Produces UE power towards a specific direction. * * @param outputDirection - The output direction. */ public boolean produceUE(ForgeDirection outputDirection) { if (!this.worldObj.isRemote && outputDirection != null && outputDirection != ForgeDirection.UNKNOWN) { float provide = this.getProvide(outputDirection); if (provide > 0) { TileEntity outputTile = VectorHelper.getConnectorFromSide(this.worldObj, new Vector3(this), outputDirection); IElectricityNetwork outputNetwork = ElectricityHelper.getNetworkFromTileEntity(outputTile, outputDirection); if (outputNetwork != null) { ElectricityPack powerRequest = outputNetwork.getRequest(this); if (powerRequest.getWatts() > 0) { ElectricityPack sendPack = ElectricityPack.min(ElectricityPack.getFromWatts(this.getEnergyStored(), this.getVoltage()), ElectricityPack.getFromWatts(provide, this.getVoltage())); float rejectedPower = outputNetwork.produce(sendPack, this); this.provideElectricity(Math.max(sendPack.getWatts() - rejectedPower, 0), true); return true; } } else if (outputTile instanceof IElectrical) { float requestedEnergy = ((IElectrical) outputTile).getRequest(outputDirection.getOpposite()); if (requestedEnergy > 0) { ElectricityPack sendPack = ElectricityPack.min(ElectricityPack.getFromWatts(this.getEnergyStored(), this.getVoltage()), ElectricityPack.getFromWatts(provide, this.getVoltage())); float acceptedEnergy = ((IElectrical) outputTile).receiveElectricity(outputDirection.getOpposite(), sendPack, true); this.provideElectricity(acceptedEnergy, true); return true; } } } } return false; } /** * The electrical input direction. * * @return The direction that electricity is entered into the tile. Return null for no input. By * default you can accept power from all sides. */ public EnumSet getInputDirections() { return EnumSet.allOf(ForgeDirection.class); } /** * The electrical output direction. * * @return The direction that electricity is output from the tile. Return null for no output. By * default it will return an empty EnumSet. */ public EnumSet getOutputDirections() { return EnumSet.noneOf(ForgeDirection.class); } @Override public float receiveElectricity(ForgeDirection from, ElectricityPack receive, boolean doReceive) { if (this.getInputDirections().contains(from)) { if (!doReceive) { return this.getRequest(from); } return this.receiveElectricity(receive, doReceive); } return 0; } @Override public ElectricityPack provideElectricity(ForgeDirection from, ElectricityPack request, boolean doProvide) { if (this.getOutputDirections().contains(from)) { if (!doProvide) { return ElectricityPack.getFromWatts(this.getProvide(from), this.getVoltage()); } return this.provideElectricity(request, doProvide); } return new ElectricityPack(); } /** * A non-side specific version of receiveElectricity for you to optionally use it internally. */ public float receiveElectricity(ElectricityPack receive, boolean doReceive) { if (receive != null) { float prevEnergyStored = this.getEnergyStored(); float newStoredEnergy = Math.min(this.getEnergyStored() + receive.getWatts(), this.getMaxEnergyStored()); if (doReceive) { this.setEnergyStored(newStoredEnergy); } return Math.max(newStoredEnergy - prevEnergyStored, 0); } return 0; } public float receiveElectricity(float energy, boolean doReceive) { return this.receiveElectricity(ElectricityPack.getFromWatts(energy, this.getVoltage()), doReceive); } /** * A non-side specific version of provideElectricity for you to optionally use it internally. */ public ElectricityPack provideElectricity(ElectricityPack request, boolean doProvide) { if (request != null) { float requestedEnergy = Math.min(request.getWatts(), this.energyStored); if (doProvide) { this.setEnergyStored(this.energyStored - requestedEnergy); } return ElectricityPack.getFromWatts(requestedEnergy, this.getVoltage()); } return new ElectricityPack(); } public ElectricityPack provideElectricity(float energy, boolean doProvide) { return this.provideElectricity(ElectricityPack.getFromWatts(energy, this.getVoltage()), doProvide); } @Override public void setEnergyStored(float energy) { this.energyStored = Math.max(Math.min(energy, this.getMaxEnergyStored()), 0); } @Override public float getEnergyStored() { return this.energyStored; } @Override public boolean canConnect(ForgeDirection direction) { if (direction == null || direction.equals(ForgeDirection.UNKNOWN)) { return false; } return this.getInputDirections().contains(direction) || this.getOutputDirections().contains(direction); } @Override public float getVoltage() { return 0.120F; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.energyStored = nbt.getFloat("energyStored"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setFloat("energyStored", this.energyStored); } }