# 26.1.2-v1.8.0
## General Updates
- Improved performance with dynamic lighting
- Added a config screen
- Fixed dynamic lighting not working with Sodium
- Light interpolation does not work, and a one-time warning will pop up if Sodium is installed
## `LightLevelProvider`
- Heavily refactored to remove generic typing and improve class structuring
- `getLightLevel(RegistryAccess, T)` has been refactored to `getLightLevel(Level, BlockPos, Object)`
- `Object` can be safely cast to the required class if needed using `LightLevelProvider.Source.ITEM_STACK`, `LightLevelProvider.Source.ENTITY`, `LightLevelProvider.Source.DATA_COMPONENT_GETTER`. Source validation is done during registry
- Some providers have been updated or renamed. The naming convention is as follows: light level providers that should take a value from the object in question, and then determine a light value from it through some calculation, should be prefixed with `map_`. This signifies that the actual value on the object is in use. All other light level providers will simply return a value.
- `if_nbt` -> `nbt`
- No longer saves NBT as a String. Instead saved as a tag in the json.
- Now has a `required_components` list. Only saves NBT to get the light level if all required data components are present.
- `match_nbt` -> `map_nbt`
- Combined other `match_nbt` subtypes into this
- Has a `source_type` field, accepting the following:
- `number`: Uses the number value directly (default)
- `item`: Obtains the item's default dynamic lighting
- `block`: Obtains the block's light level
- `fluid`: Obtains the fluid's light level
- `entity`: Obtains the entity's default dynamic lighting
- Now has a `required_components` list. Only saves NBT to get the light level if all required data components are present.
- `match_nbt_item` -> Removed
- `match_nbt_block` -> Removed
- `match_nbt_fluid` -> Removed
- `match_block` -> `block`
- `match_enchantment` -> `map_enchantment`
- `match_armor_trim` -> `armor_trim`
- May now optionally include the trim pattern as `trim_pattern`
- New Providers
- `map_block_state`
- Takes the block state item component and extracts a light level from it. Data is entered as a map of property names and light levels
- `data_component`
- Uses the supplied `predicate` to match the data components on the item or entity
- Dynamic lighting can now be registered to tags of items and entities
- Formatted as `"id": "#c:rods/blaze"`
## Emissive Textures
- Removed block emissive textures
- Emissive armor trim materials may now be defined with tags
## Mod Support
- Added support for the following:
- Curios
- Trinkets Updated
- Artifacts
- Aether II
- Aether
- Aether Treasure Reforging
- Glacidus
## Backend Changes
- The dynamic lighting engine is now ran per world
- This should enable for easier compat with mods like Immersive Portals
- The dynamic lighting engine no longer runs in its own thread in a super hacky way
- It instead runs during client level tick as a background task
- If calculations could not be finished in time for the tick to end, it will wait for the next tick to apply them
- Added `RegistryAccess` to the various plugin registry methods, passed into the various `XRegistry` classes
## LucentHooks -> LucentApi
- Updated methods to work with the new backend
## LucentCapability
- Contains various `AttachmentTypes` accessed from ClientLevel that can be used to obtain dynamic lighting.
- These attachments contain generic java functions that can be accessed regardless of if Lucent is in your development workspace.
## Plugin Refactor
- `registerArmorTrimTextureLightings(ArmorTrimLightingRegistry)` -> `registerArmorTrimEmissivity(ArmorTrimEmissivityRegistry)`
- The `@LucentPlugin` annotation is now responsible for storing run priority and the owner mod ID
- The owner mod ID still has a method for the purpose of internal helper methods
- The motivation for this change was primarily for internal reasons, however it allows for a plugin class to be validated without initializing the class
### Old Format
```java
@LucentPlugin
public final class LavaMonsterPlugin implements ILucentPlugin
{
@Override
public String ownerModID()
{
return "lava_monster";
}
}
```
### New Format
```java
@LucentPlugin(modid = LavaMonsterPlugin.MODID)
public final class LavaMonsterPlugin implements ILucentPlugin
{
static final String MODID = "lava_monster";
@Override
public String modid()
{
return MODID;
}
}
```
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }