promotional bannermobile promotional banner

Overgrown's Apoli

A data-driven power system that's build for custom abilities, mechanics, and entire origin systems from JSON alone.
Back to Files

Apoli (1.119.0)

File nameapoli-1.119.0.jar
Uploader
OvergrownMCOvergrownMC
Uploaded
Oct 24, 2026
Downloads
34
Size
30.2 MB
Mod Loaders
Fabric
File ID
9309594
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

Fabric

modImplementation "curse.maven:apoli-1631826:9309594"

Learn more about Curse Maven

What's new

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.

{
  "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

  • 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.

{
  "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.

Type
Name
Game Versions
Mod Loaders
Size
Downloads
Uploaded