Apoli is a data-pack-driven power system for Minecraft. It lets pack authors build custom abilities, status effects, game mechanics, movement, combat, rendering, world interaction, and more! Entirely through JSON. No Java required. It's the engine behind Overgrown's Origins.
This repository holds one branch per Minecraft version / mod loader combination, all kept at feature parity and sharing the same data pack format:
| Branch | Loader | Minecraft |
|---|---|---|
Fabric-1.20.1 |
Fabric | 1.20.1 |
Fabric-1.21.1 |
Fabric | 1.21.1 |
NeoForge-1.21.1 |
NeoForge | 1.21.1 |
- 100+ built-in power types spanning movement, combat, resource & attribute manipulation, rendering/HUD, world interaction, and meta/utility behavior.
- A typed action system (entity, bi-entity, block, item, meta) and a condition system spanning 7 context types.
- Every power supports a universal
conditionfield, condition inversion, and source-based suppression to temporarily disable a granted power without removing it.
- Data-driven skill trees: Progression paths and unlockable abilities, defined entirely in a data pack.
- Physics-based rope & grapple system: Swing, leap, and reel, anchored to entities or blocks.
- Entity disguise system: Transform mobs and players, fully synced in multiplayer.
- Custom entities: Projectiles, minions, and player clones, grantable via powers.
- Data-driven keybindings: Bind an active power to a key entirely from JSON.
- Custom recipes and loot functions that grant powers.
- A built-in expression engine for math-driven values with resource caps, attribute modifiers, damage scaling, and more, written as formulas instead of fixed numbers.
- Powers are indexed per-entity at grant/revoke time, so hot paths (tick, collision, damage) do O(1) lookups against a cached index instead of scanning every power on every check.
- Power sync to clients is chunked and compressed, so large data packs never hit Minecraft's packet string limit.
- A versioned network protocol checks client/server compatibility on join, so a mismatched build fails with a readable message instead of a silent desync.
- Backward-compatible: JSON handling fields renamed or restructured across versions still parse from their older form, so existing data packs keep working after an update.
- Optional integration with Trinkets, Curios, and Accessories, unified behind one facade to use whichever accessory-slot mod the pack's modpack already has.
- Optional integration with Figura, Icarus, and Hardcore Revival. Each compiles against the mod's API but no-ops cleanly if the mod isn't installed.
Powers live under data/<namespace>/powers/<power>.json in a data pack and get granted to entities directly, or through an Overgrown's Origins origin. A minimal power looks like:
{
"type": "apoli:action_on_use",
"action": {
"type": "apoli:effect",
"effect": "minecraft:speed",
"duration": 200,
"amplifier": 1
}
}Requires JDK 17.
./gradlew build
Use ./gradlew runClient / ./gradlew runServer for a dev environment. See the Fabric documentation for IDE setup.
See LICENSE.