Описание
# TFC Registry API
A lightweight library mod that automatically discovers and unifies **all** TerraFirmaCraft registry types added by any mod. It works with **any** addon, as long as they correctly implement this library's registry interfaces or TFC's own:
- `RegistryMetal`
- `RegistryRock`
- `RegistrySoilVariant`
- `RegistryWood`
Where these are provided by this library:
- `RegistryOre`
- `RegistrySand`
- `RegistrySoil`
### How discovery works
The mod automatically finds all types **if**:
- The type implements the correct `Registry[Type]` interface
- The type is an **enum** (required for auto-discovery)
If an addon does **not** use enums or needs manual registration, it can still be supported by the addon developer by calling the helper registration methods directly:
Example: manually register soil variants from a non-enum source
```java
SoilVariantRegistryHelper.registerTypes(
YourSoilVariantClass.class,
List.of(yourVariant1, yourVariant2, ...),
"yourmodid"
);
```
Same method exists in every helper class:
```java
MetalRegistryHelper.registerTypes(...)
WoodRegistryHelper.registerTypes(...)
RockRegistryHelper.registerTypes(...)
OreRegistryHelper.registerTypes(...)
SoilRegistryHelper.registerTypes(...)
SandRegistryHelper.registerTypes(...)
SoilVariantRegistryHelper.registerTypes(...)
```
Code examples:
```java
// Metals
List allMetals = MetalRegistryHelper.getAllMetalValues();
RegistryMetal brass = MetalRegistryHelper.getMetalValueOrDefault("brass");
// Woods
List allWoods = WoodRegistryHelper.getAllWoodValues();
RegistryWood ebony = WoodRegistryHelper.getWoodValueOrDefault("ebony");
// Rocks
List allRocks = RockRegistryHelper.getAllRockValues();
RegistryRock marble = RockRegistryHelper.getRockValueOrDefault("marble");
// Ores
List allOres = OreRegistryHelper.getAllOreValues();
RegistryOre sphalerite = OreRegistryHelper.getOreValueOrDefault("sphalerite");
// Soils
List allSoils = SoilRegistryHelper.getAllSoilValues();
RegistrySoil duff = SoilRegistryHelper.getSoilValueOrDefault("duff");
// Sand colors
List allSands = SandRegistryHelper.getAllSandValues();
RegistrySand white = SandRegistryHelper.getSandValueOrDefault("white");
// Soil variants
List allVariants = SoilVariantRegistryHelper.getAllSoilVariantValues();
RegistrySoilVariant inceptisol = SoilVariantRegistryHelper.getSoilVariantValueOrDefault("inceptisol");
```
All `get[Type]ValueOrDefault("name")` methods are case-insensitive and return a safe fallback if not found.
For example, iterating over the `List` list, can yield a list of wood types like this, where this shows a scenario with [ArborFirmaCraft]() installed:
```java
acacia, ash, aspen, birch, blackwood, chestnut, douglas_fir, hickory, kapok, mangrove, maple, oak, palm, pine, rosewood, sequoia, spruce, sycamore, white_cedar, willow, araucaria, baobab, beech, cypress, eucalyptus, fig, ginkgo, hevea, ipe, ironwood, mahoe, mahogany, teak, tualang
```
You can easily register new blocks using the lists/getters provided by the helpers. Here is shown an example of how to add a new `SoilBlock` for all registered soil types and soil variants:
```java
public static final Map NEW_SOIL_BLOCKS =
SoilRegistryHelper.getAllSoilValues().stream()
.collect(Collectors.toMap(
type -> type,
type -> SoilVariantRegistryHelper.getAllSoilVariantValues().stream()
.collect(Collectors.toMap(
variant -> variant,
variant -> register(type.toString() + "/" + variant.toString(),
() -> new SoilBlock(Block.Properties.of().mapColor(MapColor.DIRT).strength(1.4f), type, variant))
))
));
```
For example: if a block/item/entity/whatever constructor *insists* on using e.g. `SoilBlockType`, such as [ConnectedGrassBlock](), you can safely cast your `soil` from the RegistrySoil interface to it like this `(RegistrySoil)(Object)soil` (*or however else you prefer to do it*), since I've made TFC's `SoilBlockType`enum class implement the custom `RegistrySoil` interface.
Ideal for addons, modpack makers, or any setting that needs to work with every TFC-compatible metal, wood, rock, ore, soil, sand, or variant regardless of which mods are installed.
For example, you can use the registry type lists created by this library, to easily create new blocks, items, entities etc. for all of or the desired entries of the specific type.