| package li.cil.oc.api.network; |
| |
| /** |
| * Interface for nodes that act as power connectors between their network and |
| * some power producer or consumer. |
| * <p/> |
| * For each connector a buffer is managed. Its size is initialized via the |
| * factory function in the network API, but can also be configured later on. |
| * Its current fill level can be queried and manipulated as desired. |
| * <p/> |
| * Each connector can take two roles: it can be a <em>producer</em>, feeding |
| * power into the network, or it can be a <em>consumer</em>, requiring power |
| * from the network to power something (or it can be both). This depends |
| * entirely on how you call {@link #changeBuffer}, i.e. on whether you |
| * fill up the connectors buffer or drain it. |
| * <p/> |
| * To feed power into the network, simply fill up the buffer, to consume power |
| * take power from the buffer. The network will balance the power between all |
| * buffers connected to it. The algorithm goes as follows: if there was a change |
| * to some buffer, computer the average power available in all buffers. Build |
| * two sets: those of buffers with above-average level, and those with below- |
| * average fill. From all above-average buffers take so much energy that they |
| * remain just above average fill (but only take integral values - this is to |
| * avoid floating point errors causing trouble). Distribute the collected energy |
| * equally among the below-average buffers (as good as possible). |
| */ |
| public interface Connector extends Node { |
| /** |
| * The energy stored in the local buffer. |
| */ |
| double localBuffer(); |
| |
| /** |
| * The size of the local buffer. |
| */ |
| double localBufferSize(); |
| |
| /** |
| * The accumulative energy stored across all buffers in the node's network. |
| */ |
| double globalBuffer(); |
| |
| /** |
| * The accumulative size of all buffers in the node's network. |
| */ |
| double globalBufferSize(); |
| |
| /** |
| * Try to apply the specified delta to the <em>global</em> buffer. |
| * <p/> |
| * This can be used to apply reactionary power changes. For example, a |
| * screen may require a certain amount of energy to refresh its display when |
| * a program tries to display text on it. For running costs just apply the |
| * same delta each tick. |
| * <p/> |
| * If the specified delta cannot be completely applied to the buffer, the |
| * remaining delta will be returned. This means that for negative values |
| * a part of the energy will have been consumed, though. |
| * <p/> |
| * If there is enough energy or no overflow this will return <tt>0</tt>. |
| * <p/> |
| * Keep in mind that this change is applied to the <em>global</em> buffer, |
| * i.e. energy from multiple buffers may be consumed / multiple buffers may |
| * be filled. The buffer for which this method is called (i.e. this node |
| * instance) will be prioritized, though. |
| * |
| * @param delta the amount of energy to consume or store. |
| * @return the remainder of the delta that could not be applied. |
| */ |
| double changeBuffer(double delta); |
| |
| /** |
| * Like {@link #changeBuffer}, but will only store/consume the specified |
| * amount of energy if there is enough capacity/energy available. |
| * |
| * @param delta the amount of energy to consume or store. |
| * @return <tt>true</tt> if the energy was successfully consumed or stored. |
| */ |
| boolean tryChangeBuffer(double delta); |
| |
| /** |
| * Change the size of the connectors local buffer. |
| * <p/> |
| * If the size is reduced, any superfluous energy is distributed across |
| * other connectors' buffers in the network, if possible. Any surplus |
| * energy that cannot be stored in other buffers will be lost. |
| * <p/> |
| * Note that this automatically called when the connector is disconnected |
| * from its network to set its buffer size to zero and distribute its |
| * energy to other connectors in the network. |
| * |
| * @param size the new size of the local buffer. Note that this is capped |
| * to a minimum of zero, i.e. if a negative value is passed the |
| * size will be set to zero. |
| */ |
| void setLocalBufferSize(double size); |
| } |