## 1.119.0
Update the client, the server and Origins together.
### Before you update
- Custom status effects grant their powers from the source `apoli:effect/<namespace>/<path>` instead of the effect's own ID. A data pack that checks or revokes those grants by source needs the new name.
- `apoli:modify_xp_gain` used to do nothing. Packs that already use it will now change experience gains.
### Added: apoli:connected_blocks
Runs a block action on every block connected to this one, nearest first, such as the rest of a tree or an ore vein. The starting block is not part of the group.
| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `block_action` | Block Action | required | Runs on each block in the group. |
| `block_condition` | Block Condition | optional | Which blocks belong to the group. Without it, the group is every block of the same type as the starting one. |
| `diagonal` | Boolean | `true` | Whether blocks that touch at an edge or corner count as connected. |
| `downward` | Boolean | `true` | Whether the search can spread downward. |
| `limit` | Integer | `64` | The most blocks in the group, `1` to `1024`. |
| `neighbor_condition` | Block Condition | optional | The action only runs if a block next to the group matches this. |
| `actor_condition` | Entity Condition | optional | Checked on the entity behind the action before each block. The action stops the first time it fails. |
Inside `block_action`, `count` is the size of the group and `index` is the position of the current block. The search never loads chunks.
```json
{
"type": "apoli:connected_blocks",
"downward": false,
"limit": 256,
"neighbor_condition": {
"type": "apoli:all_of",
"conditions": [
{
"type": "apoli:in_tag",
"tag": "minecraft:leaves"
},
{
"type": "apoli:block_state",
"property": "persistent",
"value": false
}
]
},
"block_action": {
"type": "apoli:break_block",
"mine": true
}
}
```
### Added: mining as the player
`apoli:break_block` has a `mine` field. With `true`, the player behind the action mines the block: their tool takes durability, its enchantments apply and ores drop experience. The break is refused in spawn protection, adventure mode and claimed areas. A power does not fire again for blocks its own action breaks, so an `action_on_block_break` can mine more blocks without looping.
### Added: break speed that depends on a block group
`apoli:modify_break_speed` has a `connected_blocks` field that takes the same group fields as the block action. The expression variable `count` in the modifiers is the group's size. The group is worked out at most once per tick.
### Added: durability in expressions
`durability[slot]` reads how many uses the item in a slot has left. `target_durability[...]` and `actor_durability[...]` do the same for the other entity's items.
### Added: apoli:action_on_tame
Runs a bi-entity action (actor: the tamer, target: the animal) when the player tames a wolf, cat or parrot with food, or breaks in a horse, donkey, mule or llama. The fields are `bientity_action` and `bientity_condition`.
### Added: apoli:action_on_breed and apoli:breed
`apoli:action_on_breed` runs when animals the player fed have a baby. `bientity_action` and `bientity_condition` see the breeder and the baby, and `parents_action` sees the parent that had the baby and its mate. The new bi-entity action `apoli:breed` gives two adult animals a baby right away, with the usual experience, statistics and cooldown. A baby from a power's own `parents_action` does not trigger that power again.
```json
{
"type": "apoli:action_on_breed",
"parents_action": {
"type": "apoli:random_chance",
"chance": 0.2,
"action": {
"type": "apoli:breed"
}
}
}
```
### Added: apoli:share_effects
When the entity gains a status effect, nearby entities get a copy at the same level and duration.
| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `radius` | Vector | `8` | How far from the entity's hitbox: one value for every axis, or one per axis. |
| `bientity_condition` | Bi-entity Condition | optional | Actor: the entity with the power. Target: the one that would get the copy. |
| `effects` | Identifier or array | optional | Only these effects (`#` for tags). |
| `category` | String or array | optional | Only these categories. |
| `include_ambient` | Boolean | `false` | Whether beacon and conduit effects are shared too. |
### Added: apoli:modify_projectile_divergence
Changes how far the entity's projectiles stray from the aim, using `modifier` or `modifiers`. An optional `bientity_condition` takes the shooter as the actor and the projectile as the target. It covers bows, crossbows, tridents, thrown items and `fire_projectile`.
### Added: apoli:modify_enchantability
Changes the enchantability of items the player enchants at an enchanting table, using `modifier` or `modifiers`. An optional `item_condition` limits which items it applies to. Higher enchantability means better rolls at the same level cost. Loot and trades are not affected.
### Added: apoli:infinite_trades
The player's trades do not use up merchant offers, so a merchant never sells out for them. The only field is `bientity_condition` (actor: the player, target: the merchant).
### Added: apoli:extra_trades
Gives merchants trades that only players with the power see. Each entry of `trades` has `buy`, `buy_b` (optional) and `sell`, each an item stack or `{"loot_table": "<id>"}`, plus `max_uses` (`12`), `xp` (`1`) and `price_multiplier` (`0.05`). The trades are rolled once per merchant and power, saved with the merchant and kept out of the merchant's own offer list. It also takes an optional `bientity_condition`.
### Added: apoli:modify_anvil
`repair_material_modifier` changes how many pieces of repair material a full repair takes (`4`). `combine_bonus_modifier` changes the bonus durability, in percent, that combining two items adds (`12`). An optional `item_condition` checks the item in the first slot.
### Added: apoli:sneaky
The entity counts as sneaking for everything that reacts to a quiet player, without crouching. Nameplates hide behind blocks and only show within 32 blocks. It makes no footstep sounds or step vibrations on the ground. Mobs notice it from 80% of their usual distance, and foxes do not flee.
### Added: apoli:prevent_level_event
Stops world events the entity causes, for everyone including itself. Vanilla ties four to a player: block breaking (`2001`) and waxing, unwaxing and scraping copper (`3003`, `3004`, `3005`). The `events` field is optional; leave it out to stop every event.
### Fixed: apoli:modify_xp_gain
The power type was registered but never hooked up. It now changes the experience from orbs the player picks up, after Mending takes its share; `/xp` is unaffected. With the new `block_condition`, it changes the experience from cooking in a matching furnace, smoker or blast furnace instead.
### Fixed: powers firing twice on Fabric 1.20.1
`apoli:action_on_block_use` powers that let the click through ran twice per click, and `apoli:action_on_sending_message` ran twice for messages it let through. Both events were registered twice.
### Fixed: apoli:modify_food on the last item
`entity_action` and `item_action` did not run when the eaten stack had one item, such as a bowl of stew. On 1.20.1, `replace_stack` did not run either. The powers that apply are now decided before the item is used up.
### Fixed: custom status effects taking other powers with them
When a custom effect ended, it removed every power granted from a source with the effect's ID, including the sub-powers of an `apoli:multiple` with the same ID. Effects now use their own source, and grants saved before this version are still cleaned up.
---
## 1.118.1
Update the client, the server and Origins together.
### Added: apoli:attribute_modify_transfer
Applies the modifiers on one of the entity's attributes to a value another power type changes. The Avian's _Like Air_ uses it, so every walking-speed bonus (Speed, sprinting, Tailwind) also counts in the air.
| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `class` | Identifier | required | The power type that receives the modifiers: `modify_air_speed`, `modify_swim_speed`, `modify_jump`, `modify_slipperiness`, `modify_velocity`, `modify_falling`, `modify_break_speed`, `modify_exhaustion`, `modify_healing`, `modify_damage_dealt`, `modify_damage_taken`, `modify_projectile_damage`, `modify_status_effect_amplifier`, `modify_status_effect_duration` or `modify_fov`. |
| `attribute` | Identifier | required | The attribute whose modifiers are passed on. |
| `multiplier` | Float | `1` | Scales each transferred modifier. |
```json
{
"type": "apoli:attribute_modify_transfer",
"class": "modify_air_speed",
"attribute": "minecraft:generic.movement_speed",
"multiplier": 1
}
```
The transferred modifiers are applied the way the attribute applies its own modifiers and are cached with it, so a transfer costs about as much per tick as one more modifier.
### Added: custom ingredients
Ingredients accept Fabric and NeoForge custom ingredients on both loaders: `fabric:components`, `fabric:custom_data`, `fabric:any`, `fabric:all`, `fabric:difference`, `neoforge:components`, `neoforge:compound`, `neoforge:intersection` and `neoforge:difference` (`fabric:nbt` on 1.20.1), plus the types other mods register on their own loader. With `apoli:ingredient`, item conditions can now check a potion's contents, a loaded crossbow or any other component.
```json
{
"type": "apoli:ingredient",
"ingredient": {
"fabric:type": "fabric:components",
"base": "minecraft:potion",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:swiftness"
}
}
}
}
```
### Added: skill costs, rewards and separate branches
- `cost` can spend any tree's points (`"skill_tree"`, or a list of point entries), and any entry or the whole cost can be `hidden`.
- `reward` gives points (to any tree) and items when the skill is bought. The hover card lists them along with the powers the skill grants, and they can be hidden too.
- `placement: [x, y]` draws a skill as the start of its own branch, with no line to its parent.
- A refund gives back exactly what was paid and takes the rewards back. It requires the player to still have the rewards; `unbuy` and resets take back what is left.
### Fixed: skill tree order
Tabs and sibling skills that share an `order` are now sorted by id, so they no longer change order between server starts.
### Fixed: ingredients
When an ingredient object has both `item` and `tag`, it uses `item`, as documented. A broken ingredient on 1.20.1 now reports the actual problem instead of `Not a json array`.
### Fixed: layered sounds
`apoli:replace_sound_emission` and `apoli:replace_sound_reception` with `"replace": false` now play the replacement on top of the original sound, as documented. Before, the original never played, so a power that layers a chime over every sound left only the chime, for the holder and everyone around them. When a layered sound plays over a sound the player already hears, the original keeps playing, including its loop, and the layered sound plays once.
### Fixed: item pickup powers
`apoli:action_on_item_pickup` and `apoli:prevent_item_pickup` did nothing at all. Both now work for players and for mobs that pick up loot.
- `item_action` changes the item just before it goes into the inventory (on a player, only when it fits), and `bientity_action` runs once the item is in. The actor is the entity that threw the item; drops and broken blocks have no thrower, so act on the picker with `apoli:target_action`.
- `prevent_item_pickup` leaves the item on the ground and runs its actions on every attempt.
### Added: `priority` on action_on_item_pickup
| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `priority` | Integer | `0` | With several of these powers, higher priorities run first. |
### Fixed: prevent_sleep and spawn points
`apoli:prevent_sleep` with `"set_spawn_point": false` moved the spawn point to the bed anyway, with or without a `block_condition`. A bed the power refuses now leaves the spawn alone, and `"set_spawn_point": true` sets the spawn without letting the player sleep. The power's message also replaces "You can only sleep at night" and the warning about monsters nearby.
### Added: expressions in model_color
`red`, `green`, `blue` and `alpha` of `apoli:model_color` accept expressions, for the whole model and in each `parts` entry. They are evaluated every frame against the entity holding the power.
```json
{
"type": "apoli:model_color",
"green": "clamp(health / max_health, 0.2, 1)",
"blue": "clamp(health / max_health, 0.2, 1)"
}
```
### Added: attributes in expressions
`attribute[<id>, <query>]` reads an attribute, with the same numbers as `/attribute`. `target_attribute[...]` and `actor_attribute[...]` read the other entity's attributes in bi-entity actions.
| Query | Reads |
| --- | --- |
| `get` (default) | The value with every modifier applied |
| `base` | The base value |
| `default`, `min`, `max` | The attribute's default value and allowed range |
| `has` | `1` if the entity has the attribute |
| `modifier, <id>` | The amount of one modifier, `0` if absent |
| `has_modifier, <id>` | `1` if the modifier is present |
Modifier ids are `namespace:path` on 1.21.1 and UUIDs on 1.20.1, as in `/attribute`. A mistyped attribute id is a load error naming the expression.
### Fixed: custom status effects after /reload
Applying a custom status effect to a player after `/reload` could disconnect them with a "Can't find id" error. `/reload` now updates a custom effect in place instead of replacing it.
Optional dependencies
You're in Grave Danger
Any compatible version
Figura
Any compatible version
KubeJS
Any compatible version
Sable
Any compatible version
woodwalkers
Any compatible version
Embeddium (Rubidium) Extra
Any compatible version
LambDynamicLights - Dynamic Lights
Any compatible version
Sodium Extra
Any compatible version
[EMF] Entity Model Features
Any compatible version
ImmediatelyFast
Any compatible version
[ETF] Entity Texture Features
Any compatible version
Simple Voice Chat
Any compatible version
Sodium
Any compatible version
GraveStone Mod
Any compatible version
3D Skin Layers
Any compatible version
Hardcore Revival
Any compatible version
Rubidium
Any compatible version
Ears
Any compatible version
Gravestones
Any compatible version
Lithium
Any compatible version
Not Enough Recipe Book [NERB]
Any compatible version
Accessories
Any compatible version
Curios API
Any compatible version
Icarus
Any compatible version
Pufferfish's Skills
Any compatible version
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" }