Tags
Creators
Details
1.119.0
Compatibility
Required content
Changes
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_gainused 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.
{
"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.
{
"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. |
{
"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.
{
"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
costcan spend any tree's points ("skill_tree", or a list of point entries), and any entry or the whole cost can behidden.rewardgives 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;
unbuyand 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_actionchanges the item just before it goes into the inventory (on a player, only when it fits), andbientity_actionruns 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 withapoli:target_action.prevent_item_pickupleaves 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.
{
"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
Supplementary resources
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:i2NQbLvK:tESmBbuQ"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:i2NQbLvK:tESmBbuQ"
}

