101 lines
4.5 KiB
Text
101 lines
4.5 KiB
Text
-----------------------------------------------------
|
|
-- How to implement your own energy network blocks --
|
|
-----------------------------------------------------
|
|
|
|
There are currently three different types of energy network blocks:
|
|
- energy sources, e.g. generators or the output side of a storage block/transformer
|
|
- energy sinks, e.g. machines or the input side of a storage block/transformer
|
|
- conductors, e.g. cables
|
|
|
|
Note that storage blocks or transformers are both sources and sinks.
|
|
|
|
All those blocks have to have a tile entity which has to implement the interface corresponding to
|
|
its function and also post events to the Forge event bus.
|
|
|
|
The energy generation, distribution and consumption is strictly limited to the simulating (server)
|
|
side, use the proper side checks before posting the related events. One possibility is to check for
|
|
FMLCommonHandler.instance().getEffectiveSide().isClient() being false.
|
|
|
|
The energy network works by sources pushing energy into the grid through EnergyTileSourceEvent,
|
|
conductors will carry the energy to sinks which will then receive it through injectEnergy().
|
|
|
|
-- EnergyTileLoadEvent --
|
|
|
|
For all energy network tiles (sources, sinks, conductors) you have to post an EnergyTileLoadEvent.
|
|
|
|
The event has to be posted as soon as the implementing tile entity is fully loaded, usually after
|
|
loading the chunk which contains it or after the user placing the block.
|
|
|
|
The energy net implementation will use the event to add it to its energy grid map, taking it into
|
|
account for further energy transfers.
|
|
|
|
You can detect the loading by either using the 1st iteration of updateEntity() or by waiting for
|
|
the next world tick after TileEntity.validate(). The 2nd approach is obviously more sophisticated
|
|
and requires to use some tick queuing mechanism.
|
|
|
|
The event can by posted as following:
|
|
MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this));
|
|
|
|
-- EnergyTileUnloadEvent --
|
|
|
|
Another event every energy tile has to post is the EnergyTileUnloadEvent.
|
|
|
|
The event has to be posted as soon as the implementing tile entity is being unloaded, either by
|
|
unloading the containing chunk or by destroying the block containing it.
|
|
|
|
It's possible to detect the unloading by triggering on both the beginning of
|
|
TileEntity.invalidate() and the beginning of TileEntity.onChunkUnload().
|
|
|
|
It is important that the tile entity is still properly linked to the world while posting the unload
|
|
event, otherwise the energy net can't find all affected connections.
|
|
|
|
-- energy source --
|
|
|
|
An energy source has to post the following events:
|
|
- EnergyTileLoadEvent on load
|
|
- EnergyTileUnloadEvent on unload
|
|
- EnergyTileSourceEvent whenever it wants to send energy
|
|
|
|
Additionally the interface IEnergySource has to be implemented.
|
|
|
|
The EnergyTileSourceEvent contains a field amount, which should be evaluated after having posted
|
|
the event. The value determines how much energy couldn't be delivered somewhere.
|
|
|
|
-- energy sink --
|
|
|
|
An energy sink has to post the following events:
|
|
- EnergyTileLoadEvent on load
|
|
- EnergyTileUnloadEvent on unload
|
|
|
|
Additionally the interface IEnergySink has to be implemented.
|
|
|
|
The method demandsEnergy() will be called fairly often and should be implemented with performance
|
|
in mind. It's usually recommended to always fill some small internal buffer regardless of other
|
|
conditions, e.g. even if an enabling redstone signal is off.
|
|
|
|
-- energy conductor --
|
|
|
|
An energy conductor has to post the following events:
|
|
- EnergyTileLoadEvent on load
|
|
- EnergyTileUnloadEvent on unload
|
|
|
|
Additionally the interface IEnergyConductor has to be implemented.
|
|
|
|
|
|
--------------------------------------------------
|
|
-- How to implement/add your own energy network --
|
|
--------------------------------------------------
|
|
|
|
If you want to create an alternative way of distributing energy, e.g. to have different
|
|
distribution rules or to use energy networks provided by other mods, you can register to the energy
|
|
tile events and use the interfaces to handle the energy distribution yourself. It's no longer
|
|
required to use conversion blocks.
|
|
|
|
IC2's EnergyNet itself is built on top of the api events and interfaces, providing their default
|
|
use case.
|
|
|
|
Note that is you have a pull-type energy network which lets the sinks retrieve energy from the
|
|
sources instead of IC2's method of pushing energy from the sources to the sinks, you'll currently
|
|
have to monitor the energy sinks regularly for their energy demand and start/stop pulling energy
|
|
accordingly. The load and unload events will tell you when to start/stop monitoring demandsEnergy.
|
|
|