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.73.0)

File nameapoli-1.73.0.jar
Uploader
OvergrownMCOvergrownMC
Uploaded
Sep 8, 2026
Downloads
66
Size
29.2 MB
Mod Loaders
Fabric
File ID
8840853
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

Fabric

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

Learn more about Curse Maven

What's new

1.73.0

Prevent Entity Use and Prevent Being Used now work. Both are aliases of one power type that was registered but never hooked into anything, so every field in them parsed correctly and then did nothing. They now block the right-click on the server and on the client, so the client no longer plays an interaction the server is about to take back, and the bi-entity action, held item action, result stack and result item action all run once per blocked interaction.

Prevent Item Use now applies to items that are both food and a block, such as sweet berries, glow berries and nether wart. When you were looking at a block and placement failed, the game took a route that skipped Apoli's item-use hook entirely and the item was eaten anyway. This affected any food block item whose placement failed, not only the case where Prevent Block Place was what stopped it.

Item stack components now parse properly on 1.21.1. Anything written in a components block that refers to a datapack registry — enchantments, banner patterns, trim materials, jukebox songs — was being read without access to those registries. Enchantments failed outright with a "Can't access registry" error and banner patterns quietly asked for a full pattern definition instead of accepting a pattern id. This affected every item stack in a power: skill icons, apoli:modify_harvest's stack, every result_stack. Powers that failed this way were also dropped from the copy sent to clients, so they could work on the server and be missing on every client.

Action On Wake Up now only fires when a sleep actually finished, instead of every time a player leaves a bed. A new require_full_sleep field, default true, controls this; set it to false for the old behaviour.

New bi-entity action apoli:both, which runs one entity action on both the actor and the target. It is the action counterpart of the apoli:both condition that already existed.

apoli:punch gained ignore_cooldown and reset_cooldown. Punching several targets in one tick used to charge the attack cooldown on the first one, so everything after it took minimum damage. ignore_cooldown lands every punch at full strength, and reset_cooldown: false leaves the player's own swing timing untouched.

The disguise command accepts a shorthand: /disguise <targets> <disguise>, with an optional NBT argument. The name is read as an entity type first and as a player name second, so /disguise @s creeper and /disguise @s notch both work. The entity, player, random, clear and query sub-commands are unchanged.

1.72.0

Projectiles under a tick rate stopped and started instead of moving smoothly. The cause was the rate at which the server sent position packets, not the client's interpolation, and it is fixed on the server.

/apoli:dev_mode now outlines every radius rather than only Area Of Effect and Raycast. Blue is a radius that acts on something, green is a radius that is only being tested by a condition, and red is still a raycast.

Resources can be used in command macros through the arguments field, and this was verified working in every shape. Undefined $(key) macros now log the exact reason a key was missing, and repeat it in chat when dev mode is on.

1.71.0

Fixed a swapped player model leaking its pose into the first-person hand. Four Arms rotated the held hand upward, StinkFly drew it displaced and stretched, and the centaur shifted it by the whole torso offset.

1.70.1

Fixed projectiles jittering under a tick rate. They are no longer simulated on the client at all, which is how mobs already worked.

The first-person view now follows a tick rate as well: the punch animation, the bow draw, the view bob and the hurt flash all advance at the slowed rate instead of at full speed.

1.70.0

Rebuilt the client half of per-entity tick rates on the same model vanilla uses for /tick rate, so a slowed entity moves once per slow tick with the frames in between interpolated, instead of skipping ticks. The local player's camera is interpolated across the interval too, which was the "super choppy" report.

Fixed include_self: false being defeated by the entity to chunk to dimension fallback.

1.69.2

Slowed projectiles and dropped items stop rubber-banding. The client no longer simulates them and drives them purely from server packets.

1.69.1

Fixed three separate client-side problems with tick rates: mob heads and frozen entities jittering, projectiles rubber-banding, and the held item jerking in first person.

A player frozen in mid-air is no longer kicked for flying.

1.69.0

/tick gained entity and chunk branches, added onto Minecraft's own command rather than replacing it. Because vanilla /tick needs permission level 3 and a datapack function only has 2, the same tree is also registered as /apoli:tick at level 2, which is the form to use inside a function. On 1.20.1, where vanilla has no /tick, the command is created with just those two branches.

Fixed serious lag from apoli:modify_tick_rate with target: server. It was broadcasting a packet to every player and resetting the tick loop every single tick. It now only acts when the value actually changes, and it restores the operator's own rate when the power lapses instead of leaving the server slowed forever.

apoli:action_on_mouse_movement was completely dead on NeoForge. The 1.68.0 rewrite of the input hook only reached the two Fabric versions.

spread on apoli:particle silently ignored a plain number and used the default instead of reporting an error.

Every number on a particle is now an expression: count, speed, spread, the offset and velocity fields and frequency on the power and both actions, and size, lifetime, gravity, friction, frames, frame_time and the variation fields on apoli:custom. These are evaluated on the server when the particle spawns, so the client is untouched and a constant costs nothing.

1.68.0

Powers can carry tags, and apoli:transfer, apoli:suppress_power and apoli:unsuppress_power can target by tag. This is what makes "copy one ability off whoever you touch" a single action that keeps working when a pack adds another origin.

Origins gained origin tags and the origins:origin_tag condition.

New power type apoli:action_on_mouse_movement, with up, down, left and right triggers, a threshold in degrees, a cooldown, and an ignore_modify_cursor_speed option. The mouse_x and mouse_y expression variables are bound while its action runs.

apoli:custom_model_render now draws onto humanoid disguises. Previously a disguise rendered a stand-in entity, so the player's own render layer never ran.

1.67.0

apoli:centaur is now a real four-legged model rather than a rider pose, with the horse half drawn from its own texture and a model_texture_location field to override it.

Tick rates are a built-in subsystem: the apoli:modify_tick_rate power (per entity, per chunk, per dimension, or an area), plus apoli:tick_rate as an entity action, a block action, an entity condition and a block condition. Rates above the server's own are deliberately not supported.

apoli:spawn_particles works as a block action, and a block context now carries the precise hit position, so raycast and projectile impacts can spawn particles exactly where they landed with anchor: hit.

Grab distance is now an expression re-evaluated every tick, so a grab can reel a target in and out live. Custom particle roll and roll_speed are expressions evaluated once per particle.

apoli:fire_projectile as an action now honours interval and start_delay.

Apoli registers the origins: namespace alias itself rather than relying on Origins to do it. One unresolvable type id anywhere inside a power's action drops the whole action, so a legacy origins: id nested deep in a pack could silently kill a perfectly valid sibling branch when Origins was not installed.

1.66.0

apoli:modify_player_model gained texture_location, which defaults to the holder's own skin, and animations, which reuses the same condition-selected clip list custom_model_render already had. A new reserved apoli:vanilla model id lets a power change only the texture or only the animation without naming a shape it is not changing.

Fixed a swapped model's pose drifting a little further every frame, which showed up as the whole model flying away and leaving only the arms visible.

1.65.0

Three built-in models for apoli:modify_player_model: apoli:four_arms, apoli:stinkfly and apoli:digi_legs. The registry existed but nothing had ever been registered into it, so the power previously only resolved Figura avatars. All three are real player models, so skins, armour, held items, capes and every vanilla animation keep working, and modify_model_parts, model_color and body_parts can target the extra limbs by name.

1.64.0

Item stacks gained name and unbreakable fields, which work the same way on 1.20.1 and 1.21.1 without writing version-specific NBT or components by hand.

Positioned item stacks, used by starting_equipment, now share the ordinary item stack schema and gained a lock field. A locked starting item cannot be moved out of its slot and disappears if it leaves the inventory, which is what makes recurrent: true safe — the old copy deletes itself on death so a respawn grant cannot duplicate it.

New power type apoli:modify_use_slowdown, the data-driven version of the "less shield slowdown" ability. Vanilla does not slow a blocking player through an attribute, it multiplies the movement input directly, so a movement-speed workaround only ever approximated it.

1.63.0

A data-driven keybind's name now shows in the Controls screen instead of the raw key id. The field is a full text component, so a translate entry resolves on its own and a resource pack shipped later still wins.

apoli:action_on_collision tests its cooldown and condition before searching for nearby entities. A collision power gated on "only while charging" used to pay for the search every tick regardless.

count, speed and divergence on apoli:fire_projectile are expressions, so one power covers every volley and range variant.

New max_distance field on apoli:fire_projectile. An Apoli projectile does not self-accelerate the way a vanilla fireball does, so it slows asymptotically and drifts forever with nothing to despawn it — which is why even a base fireball went a very long way and a speed upgrade felt useless.

New bientity_condition on apoli:explode, with the exploding entity as the actor and each candidate victim as the target, so an explosion can spare specific entities instead of choosing between hurting everyone and hurting nobody.

1.62.0

apoli:swimming never worked. Swimming out of water made the client cancel sprinting, which made the power drop swimming again on the next tick, which is why it flickered and put you back.

render_elytra now hides the cape. Vanilla only skips the cape when the chest slot holds an actual elytra, which this power never produces.

Particle spread follows space. The origin and the velocity were rotated but the spread never was.

New damage_targets field on all three explode actions, and damage_self on the bi-entity one. With damage off the explosion is a shove rather than a no-op, because knockback is applied outside the damage branch.

Resource and cooldown HUD bars find their own free row in the status column instead of sitting at a fixed height, so they no longer collide with the air bar, a mount's health, or another mod's bar, and no longer leave a gap when one is hidden. (Built as 1.61.0, released as part of 1.62.0.)

1.60.0

Resources can be used in apoli:execute_command macros through arguments, read live off the acting entity when the command runs, so say mana: $(mana)/$(mana_max) works. Every key gets _max and _min companions automatically.

1.59.0 and 1.59.1

apoli:overlay's set field did nothing. A set filled at login or respawn was dropped and never resent, so the overlay drew nothing with no error at all.

New /apoli:dev_mode command, a per-player debugging view that draws every raycast and radius in the world, shows raw resource values, and disables cooldowns.

Bi-entity apoli:add_velocity gained keep_speed, which changes only the heading and keeps the current speed, and blend, which moves a fraction of the way toward the new heading per tick. Together they are what a smooth homing projectile needs. A degenerate actor-to-target direction no longer zeroes the velocity and stops a projectile dead.

1.59.1 fixed both of those features being broken on NeoForge only.

1.58.0

Fixed "can't punch anything". Apoli was consuming vanilla's click queue, which left nothing for the attack.

Bi-entity apoli:add_velocity gained space, so the numbers can be read as a world-space velocity instead of relative to the actor-to-target direction.

Entity apoli:area_of_effect gained offset and space, so a small sphere in front of the face can replace a raycast for grabs.

New bi-entity apoli:modify_resource, with side and from_side, so a resource can move between two entities rather than only being changed on one.

New apoli:store_data action for entities, blocks and items, writing an id, position, state or NBT into a command storage.

New arguments field on all three apoli:execute_command actions, which is Apoli's own macro expansion. This is the answer to function macros on 1.20.1 — no backport mod needed.

Texture fields accept keywords instead of an id: player, player_face, player_cape, entity, held_item and offhand_item, resolved live at draw time.

1.57.0

Powers bound to key.jump fired one movement step too late, so a double jump keyed to the jump key with an inverted on-block condition burned a charge on the ground jump.

Particle anchors attached to a model part desynced from modify_model_parts after the first play, and a /reload appeared to fix it.

New as_player field on apoli:break_block. With it, breaking a beehive releases its bees, which the ordinary block-breaking path does not do.

Type
Name
Game Versions
Mod Loaders
Size
Downloads
Uploaded