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

File nameapoli-1.108.0.jar
Uploader
OvergrownMCOvergrownMC
Uploaded
Oct 3, 2026
Downloads
130
Size
29.8 MB
Mod Loaders
Fabric
File ID
9050053
Type
R
Release
Supported game versions
  • 1.20.1

Curse Maven Snippet

Fabric

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

Learn more about Curse Maven

What's new

1.108.0

Added — the apoli:start_raid entity action

Starts a raid on the village the entity is standing in, as if it had walked in carrying an omen, and credits the raid to that entity. If a raid is already running there, that raid absorbs the omen and grows stronger instead.

Field Type Default What it does
omen_level Integer or Expression 1 The omen level the raid absorbs, 1 to 5. A new raid starts at this level; a raid already running adds it to its own, up to 5. Higher levels add a bonus wave and give raiders better odds of enchanted gear.
success_action Entity Action optional Runs on the entity when a raid starts or grows.
fail_action Entity Action optional Runs on the entity when no raid can start.

A player who starts a raid gets the Raids Triggered statistic and fires the minecraft:voluntary_exile advancement trigger, exactly as if their own omen had started it. Mobs, armor stands and markers can run it too, and the raid starts from their position. Raids still need a village (somewhere villagers have claimed beds, workstations or a bell), a difficulty above Peaceful, the disableRaids game rule off and a dimension that has raids. When any of those is missing, nothing happens and fail_action runs, so a power can tell the player why.

{
    "type": "apoli:start_raid",
    "omen_level": 3,
    "success_action": {
        "type": "apoli:play_sound",
        "sound": "minecraft:event.raid.horn",
        "volume": 4.0
    }
}

1.107.1

Fixed — sneaking off a player you were riding

A rider placed on a player with apoli:mount could get off with the sneak key, but the player being ridden kept seeing the rider on top of them. Vanilla never tells a player about changes to their own passengers, because nothing in vanilla rides a player. Apoli now does, whatever ends the ride.

Fixed — mount offsets only showed for the carried player

An offset such as "y": -0.3 was wiped on everyone else's screen by a second passenger update that arrived right after it. Every passenger update is now followed by the offsets it belongs to, so the rider, the carried player and everyone watching agree. /apoli:mount clear now clears an offset on clients as well as on the server.


1.107.0

Added — camera, field of view and zoom

  • apoli:modify_camera (power) moves, turns, rolls and zooms the camera, or puts it on another entity picked by an entity set or a selector. Offsets can follow the camera, its yaw or the world; the camera can follow its anchor or stay where it was; it can look where its anchor looks, where you look, at a fixed angle, or track you or the anchor. keyframes animate any of it with easing or along a smooth Catmull-Rom path — enough for a dolly zoom, an orbit or a slow push-in.
  • apoli:modify_fov (power) changes the field of view the way speed effects do. Its fields match Apace's Apoli.
  • apoli:zoom (power) is a spyglass-style zoom with slower turning, optional cinematic smoothing and a hidden hand. zoom takes an expression, so a resource driven by apoli:action_on_scroll_wheel makes a scroll-wheel zoom.
  • apoli:set_perspective (entity action) switches between first person and the two third-person views, and apoli:perspective (entity condition) reads which one a player is in.

These powers decide on the server whether they are active, so their conditions can use anything, and they apply on the holder's own client.

Added — apoli:custom_model_render on every mob

Texture mode paints onto the mob's own model through its own UV layout, either replacing its texture or drawn over it; a slime's translucent shell takes it too. Geometry mode draws a Blockbench model on the mob: bones named after the mob's parts (a spider's head and right_front_leg, a ghast's tentacle0) follow those parts, and by default the model replaces the mob's own. body_parts takes the mob's part names. Paired with a global power, every zombie in the world can wear your variant.

Added — cooldowns run actions

apoli:cooldown takes min_action (runs when it becomes ready), max_action (runs when it is triggered), on_change and start_value, like a resource. A cooldown that triggers itself again from min_action is a loop.

Changed — cooldowns count down on the world clock

A cooldown no longer rewrites itself every tick, which used to send its holder's power data to everyone watching, every tick it ran. It now also keeps counting while its condition fails or its holder is offline.

Fixed — apoli:ignore_fluid

  • Sprinting while fully under ignored water dropped you into swimming for a tick and back, over and over. You no longer swim in a fluid you ignore.
  • Ignoring lava did nothing on NeoForge. Every fluid block you touch is now tested on its own, on every loader.
  • fluid_condition is optional and defaults to water, so Apace's apoli:ignore_water loads as it always did.

Fixed — apoli:modify_hearing_range seemed to do nothing

The server sent distant sounds to the holder, but the holder's own game still faded them out at the normal distance. The client now stretches the falloff too. (multiply_total multiplies by one plus the value, so "value": 3 hears four times as far.)

Fixed — smaller things

  • Every power type with a hud_render draws its bar. apoli:action_on_scroll_wheel and apoli:action_on_mouse_movement accepted one and never showed it.
  • apoli:scale written with the legacy scale_type field skipped its suppression hooks and never ticked on projectiles or other non-living entities. Suppressing a scale power now shrinks the holder back.

Performance — phasing costs almost nothing when nobody uses it

Phasing is checked against every block an entity collides with, for every entity, every tick. While no one holds a phasing power that check is now a single array read, instead of a power lookup and an allocation per block. Climbing, walk_on_fluid and ignore_fluid use the same gate.

Addon API

HudRendered lets a power type's config draw a HUD bar, and PowerType#resolvesForClient lets the server decide a client-applied power's condition.

Compatibility

On NeoForge the network version is now 14, so the server and every player need 1.107.0 or newer.


1.106.0

Fixed — apoli:grant_power on an entity that never had a power

Only entities that already held a power could receive one. A projectile fresh out of apoli:fire_projectile, an item or a mob that had never had a power was skipped without a word, so a projectile_action that granted a model, a particle trail or a marker did nothing. Every entity can receive powers now. The same fix covers apoli:grant_all_powers, the receiving side of apoli:transfer and the KubeJS grantPower helper.

Fixed — projectiles wear every model

A projectile drew only the first geometry apoli:custom_model_render power it held. It now draws all of them.

Changed — max_distance counts the path flown, and a new lifetime

max_distance on apoli:fire_projectile was a straight line from where the shot started, so a homing shot circling its target or a ball bouncing around a room could fly forever. It is now the distance travelled. The new lifetime field removes a projectile after that many ticks in the air, whatever it is doing, running bientity_action_on_expire first; it also ends returning shots.

Fixed — frozen entities stayed red

An entity frozen with apoli:tick_rate or apoli:modify_tick_rate kept its red hurt tint until it thawed. The flash now fades as usual. Its short immunity after a hit still does not count down while it is frozen, so damage that has to land on a frozen entity needs a damage type in #minecraft:bypasses_cooldown.


1.105.0

Added — homing projectiles

apoli:fire_projectile has a homing field (delay, duration, range, angle, turn_rate). The shot looks for a living entity ahead of it and curves toward it without losing speed. It never chases its shooter, their teammates, or a pet, minion or clone they own, and the shot's own hit conditions filter what it chases. The server picks the target and every client steers the same way, so the curve stays smooth.

Added — more for apoli:fire_projectile

  • reflective is an object now: {"max_bounces": 6, "speed": 0.85}, both taking expressions. "reflective": true with max_bounces and bounce_speed beside it still works.
  • bientity_action_on_expire runs when a projectile reaches max_distance and is removed.
  • offset_x, offset_y and offset_z take expressions, worked out for every projectile, so "rUni(-4, 4)" scatters a volley.

Added — custom models that animate themselves

bind_body_parts: false on apoli:custom_model_render draws a geometry model exactly as its own animations pose it: bones named head or right_arm stay inside their groups and no longer follow the player's limbs, so a creature with its own walk cycle stops walking like a player. offset moves the whole model along the holder's own left, up and forward axes. Minions and projectiles always draw their models this way now.

Changed — projectiles and summons hit as their owner

When bi-entity apoli:damage runs with a projectile, a minion or a clone as the actor, the damage is credited to its owner. Kills drop experience and player-only loot, the victim retaliates against the owner, and the death message names them.

Fixed — landing_condition tested the wrong spot

On apoli:teleport, apoli:random_teleport and apoli:teleport_to, the fluid_height, submerged_in and on_block conditions read the place the entity was leaving. A blink that refused water was turned down while you stood in water and let through into a lake. They now read the destination.

Fixed — a freeze holds through riding

A frozen player could get into a boat and ride away unfrozen. An entity's own tick rate or freeze now always applies to it; a passenger with no rate of its own takes its vehicle's; a vehicle never runs faster than whoever steers it; and a frozen vehicle stops on its rider's screen too.

Fixed — smaller things

  • apoli:delay ticks and apoli:loop value and ticks take expressions, worked out when the action starts.
  • apoli:moving works on other players on the client. It always read false there, so a walk animation keyed on it only played for yourself.

1.104.0

Performance — custom projectiles drawn by Flywheel

With Flywheel installed, the projectiles apoli:fire_projectile fires are drawn with instancing: each model is built once and the GPU draws every projectile that uses it in one go. They look the same as before. With 400 model projectiles in view, frame rates were about three times higher (NeoForge 1.21.1 ~700 → ~2,150 FPS, Fabric 1.21.1 ~770 → ~2,070, Fabric 1.20.1 ~610 → ~1,900). A projectile goes back to the vanilla renderer while it is on fire, shows a name tag, uses the energy_swirl render type or hitboxes are on; a held_item projectile needs Vanillin 1.1.3 or newer. If Flywheel ever fails while drawing one, Apoli logs it once and draws projectiles the vanilla way for the rest of the session.

Fixed — vanilla 1.21's operation names

Attribute modifier operations accept the lower-case add_value, add_multiplied_base and add_multiplied_total everywhere, on every version. A lower-case add_value used to fail with Unknown attribute modifier operation.


1.103.0

Fixed — crash on /give with Vanillin (NeoForge)

Vanillin 1.1.3 for NeoForge ships a mixin it never registers, so with its dropped-item visuals switched on, the first item entity in view crashed the game. /give @s origins:orb_of_origin was the report. Apoli now registers the missing mixin whenever Vanillin's own is absent.

Added — Flywheel and Vanillin compatibility

Flywheel draws some entities itself and skips the vanilla renderer, which is where Apoli's render powers work. While apoli:prevent_entity_render, apoli:entity_glow, a model scale, a disguise, a tick-rate change, a rider on a player or emissive light applies to such an entity, Apoli hands it back to the vanilla renderer, and returns it to Flywheel once nothing applies.

Fixed — switching origins left your size behind

Moving from an origin with apoli:scale to one without kept the old hitbox and camera, moving back gave the default size, and client and server could disagree about how big you were. Granting, revoking or suppressing a scale power now resizes you straight away on both sides.

Fixed — eye height ignored scale on 1.20.1

On 1.20.1, players and mobs with a fixed eye height (villagers, zombies, skeletons and more) kept the camera where it was while their hitbox grew. Eye height now follows apoli:eye_height, and with it base and height, as it already did on 1.21.1. On every version, changing eye_height on its own now moves the camera.


1.102.0

Added — JSON macros (contributed by FLDebug10)

Write a piece of power JSON once and call it anywhere with arguments. A macro is a file in powers with "type": "apoli:macro" and a value; a call is {"type": "apoli:macro", "macro": "<id>", "arguments": {…}} and can stand in for an action, a condition, a hud_render, a sub-power or a whole power. Macros are expanded while the data pack loads, so a power built from macros runs exactly like the same power written out by hand, and a pack without macros skips the step. Mistakes are reported with the power, the place in the file and the macros the call went through. A macro that grows out of control is stopped at 250,000 values and its power is left out, instead of stalling the reload.

Added — on_change for resources (contributed by FLDebug10)

apoli:resource takes an on_change list. Each entry compares the new value with value or values, or fires on every change when it has neither, and runs its entity_action; value inside its expressions is the new value. An action that keeps changing the resource that triggered it is stopped after 64 chained changes, with one warning in the log.

Fixed — placeholders leave selectors alone

In an apoli:function body, and in macros, only a name in square brackets is a placeholder. Target selectors like @e[distance=..5], JSON text and table reads stay as written, so commands work inside a function. "parameters": [] makes a body completely literal, and a boolean argument reads true or false on every Minecraft version.

Changed — the raycast entity condition stops at walls

The apoli:raycast entity condition judges the nearest thing the ray hits. A block that fails block_condition now blocks the ray like any other block, and hit_bientity_condition is tested on the nearest entity. A pack that used a failing block_condition to see entities through walls needs "block": false instead.

Added — dev mode draws every raycast

With /apoli:dev_mode on, every raycast draws what it tested — red for actions, yellow for the raycast conditions and can_see — including beams, cones, hits and its full reach. Conditions checked inside an apoli:action_over_time now draw their outlines too, resource min_action, max_action and on_change print a line when they run, and macro problems are shown in chat after every /reload.


1.101.0

Fixed — apoli:modify_enchantment_level did nothing

The power loaded, but nothing read it. It now changes the level the game uses for the holder's equipment: every enchantment effect (damage, protection, knockback, Looting, Mending, Unbreaking…), Fortune and Silk Touch on the blocks the holder breaks, and attribute-based enchantments such as Efficiency and Depth Strider, which update as soon as the level changes. The item itself is never changed, so tooltips, anvils, grindstones and crafting see the real enchantments. It works out which items belong to a holder when it is asked, with no inventory scan every tick.

Added — use_modifications on the apoli:enchantment conditions

Both the entity and the item condition count levels changed by apoli:modify_enchantment_level unless use_modifications is false. On the item condition, comparison and compare_to are optional now, defaulting to ">" and 0 — "has the enchantment at all".

Performance — item powers follow equipment changes

Powers carried by items were found by scanning every living entity's equipment every tick, which also gave every mob a power container. They now react to the loader's own equipment-change event.


1.100.2

Fixed — overlapping power recipes

When two apoli:recipe powers used the same ingredients, holders of the second power got an empty result slot, because the game picks the first recipe that fits the grid and stopped there when the player lacked that recipe's power. A player now gets the first fitting recipe they are allowed to craft. On 1.20.1, the powers stamped onto the crafted item come from that same recipe.

Addon API

TooltipRenderer draws a tooltip from a list of components with an image in any position. Origins uses it for recipe badges; vanilla's own method crashed on 1.20.1 when given an image and no text.


1.100.1

Fixed — crash when recipe powers share an id

Two apoli:recipe powers that wrote the same recipe id crashed the server as it finished starting (Duplicate recipe ignored with ID … on 1.20.1, Multiple entries with same key on 1.21.1). Packs made for the original Origins hit this often, because there the id never had to be unique. Identical recipes are now registered once and any of their powers unlocks them. Different recipes under one id all work, each for the holders of its own power: the extra ones are registered under their power's id, a warning names them, and apoli:modify_crafting still matches them by the id you wrote.


1.100.0

Fixed — glowing models let water show through

apoli:custom_model_render geometry with an emissive, glow or eyes render type let water and other translucent blocks behind it paint over the model. Standalone geometry now blocks what is behind it like any solid model, and keeps its full-bright look.

Changed — custom particles land

Custom particles collide with blocks unless you set "physics": false. They used to fall through the floor by default, and even with physics on, a large one sank halfway into the ground. A particle now rests on the bottom edge of its sprite.

Added — the apoli:raycast bi-entity condition

Does the actor's ray reach the target? radius turns it into a beam and cone_angle into a cone, and walls block it unless block is false. It shares the raycast action's beam and cone checks, so the two agree about which targets count.

Added — apoli:grabbed conditions

The entity condition checks whether an entity is being held by an apoli:grab; the bi-entity condition checks whether the actor is the one holding the target.


1.99.0

Changed — apoli:trigger_cooldown works on every cooldown

It starts the cooldown of any power that has one — apoli:action_on_key_press, key sequences, apoli:fire_projectile, the hit and kill powers — not only apoli:cooldown. Pointed at anything else it used to do nothing, so two abilities could not share a cooldown. A cooldown that is already running is still left alone.

Changed — raycasts without a distance stop at your reach

An apoli:raycast action or condition with no distance now reaches as far as your hand does: 4.5 blocks for blocks and 3 for entities, plus any reach bonuses, creative mode's included. It used to be 20 blocks for both. Add "distance": 20 to a raycast that relied on the old range.

Added — the apoli:in_entity_set entity condition

Counts the entity sets the entity belongs to — optionally only the sets of one power — and compares that number, so a party member can check its own membership without knowing who the leader is. Also answers to apoli:in_set.

Added — Icarus: Re-Winged support

Wings drawn by Icarus: Re-Winged follow apoli:modify_model_parts and apoli:model_color the same way Icarus's own wings do. Re-Winged draws wings with its own models (every wing on 1.21.1, its own wing items on 1.20.1), and those skipped Apoli's edits and tints.


1.98.0

Added — projectiles that come back

apoli:fire_projectile has a return object. A shot with one turns around after hitting something, at max_distance or after a set time in the air, and curves back to whoever threw it, through walls, the way a trident with Loyalty does. speed uses the Loyalty scale, hit_while_returning lets it strike on the way home, and bientity_action_on_catch runs when it is caught — where a boomerang can refund its own cooldown.

Added — expression variables for the surroundings

biome_temperature, brightness, light, block_light, sky_light and night_vision. An origin that grows stronger in the cold can feed the temperature into a resource instead of a ladder of biome conditions. apoli:night_vision takes an expression for its strength.

Added — the attack_charge expression variable (contributed by PolarKookie)

Reads the attack charge from 0 to 1. Inside a hit it reads the charge of the swing that is landing, not the meter the game has already reset — and the apoli:attack_charge entity condition now does the same.

Added — voice chat audiences (Simple Voice Chat)

apoli:action_on_speak gained bientity_action, bientity_action_stop and bientity_condition, which run on everyone close enough to hear you. apoli:modify_speaking_range takes a bientity_condition too, deciding per listener.

Added — Ears 2

Tinting and hiding single Ears features works with Ears 2 as well as Ears 1.4, and Ears 2's halo and digitigrade legs have body part names (halo, right_digitigrade_leg, left_digitigrade_leg, digitigrade_legs). Icarus wings also answer to icarus_right_wing, icarus_left_wing and icarus_wings, the names Figura uses.

Changed — apoli:modify_player_model keeps the player's skin

texture_location now paints only the parts a model adds on top of the player — the horse half of apoli:centaur — and the player half always wears the player's own skin. It used to replace the skin too, so a texture made for the horse wrecked the rider. A pack that used texture_location to re-skin the player with a model such as apoli:four_arms should move that texture to an apoli:custom_model_render in texture mode. model_texture_location is accepted as another name for the field.


1.97.0

Added — wings and Ears features are body parts

Icarus wings (right_wing, left_wing, wings) and the features Ears draws from a skin (ears, right_ear, left_ear, horns, snout, tail, claws plus one name per claw, ears_chest, ears_cape) can be named in apoli:modify_model_parts and apoli:model_color. Icarus wings take every transformation; Ears features can be hidden and tinted one at a time.

Added — animated overlays

apoli:overlay textures animate the vanilla way: stack the frames in the PNG and put a .png.mcmeta with an animation section next to it. frametime, frames and interpolate all work.

Added — one hand at a time

Two new scale types, apoli:held_item_mainhand and apoli:held_item_offhand, size the item in one hand without touching the other. Both sit on top of apoli:held_item, and both work when Pehkui is installed.

Added — projectiles and punches

The apoli:projectile_owner bi-entity condition passes when the target is a projectile the actor owns. apoli:punch gained hand, so a punch can be thrown with the off hand and hit with whatever is held there.

Changed — turtle helmets for water breathers

A turtle helmet gave anyone with apoli:water_breathing and suffocate_outside_water endless air on land. For them it now runs the other way: topped up to 10 seconds underwater, counting down on land. A potion of Water Breathing still works on top.


1.96.0

Added — grave mod compatibility

Apoli now works properly with You're in Grave Danger (all three loaders), Gravestones 1.4 or newer (Fabric) and the GraveStone Mod (NeoForge):

  • Items in an apoli:inventory with drop_on_death go into the grave instead of onto the ground. YIGD and Gravestones put each one back in the slot it came from when the grave is collected; the GraveStone Mod (and corpse mods that read the drop list) take them from the drop list.
  • apoli:keep_inventory keeps items again with YIGD installed.
  • A new GraveInscriptions API lets an addon add a line to player graves. Origins uses it to put the player's origin on the stone.

Fixed — apoli:keep_inventory with two powers on one slot

With two powers covering the same slot, the first one decided alone, so an item the second power should have kept was dropped. Either power can keep it now.


1.95.1

Fixed — You're in Grave Danger crashed 1.20.1 servers

The first player death took the server down with NoClassDefFoundError: io/github/apace100/apoli/power/InventoryPower. YIGD's built-in Origins integration is written for the original Apoli; Apoli now switches it off. (1.96.0 replaces it with real support.)

Fixed — a lethal negative apoli:heal didn't kill

A negative heal that took an entity to 0 health only set its health to 0: no death message, no drops, no apoli:action_on_death, no totem. It now deals lethal minecraft:generic damage, so the entity dies the normal way and a totem or apoli:prevent_death can still save it.

Fixed — the off-hand swing that came back

Swinging the off hand and then attacking a few ticks later swung the off hand again. Only swings that start in the same tick pair up now.

Changed — smaller things

  • A custom effect's type accepts lower case or all upper case (harmful, HARMFUL).
  • On NeoForge the network version is 13, so the server and every player need 1.95.1 or newer.

1.95.0

A feature release built on work contributed by FLDebug10 and PolarKookie.

Added — custom status effects

A file in data/<namespace>/effects/ defines a real status effect. It works with /effect, potions, apoli:apply_effect and apoli:status_effect, and while an entity has it, the entity holds the powers the file lists. The server sends the list to every client, so players only need a resource pack for icons and translations. Server owners can switch the feature off in config/apoli-effects.json.

{
    "type": "beneficial",
    "powers": ["example:frenzy_speed"],
    "r": 0.85, "g": 0.15, "b": 0.1,
    "name": "Frenzy"
}

Added — /resource operation and /execute store … resource

/resource operation combines a resource with a scoreboard score using the same operators as /scoreboard players operation, down to its rounding and its Cannot divide by zero error. resource is also a target for /execute store, and chains with the other store clauses.

resource operation @s example:mana += @s mana_bonus
execute store result resource @s example:mana run data get entity @s XpLevel

Added — new types

  • apoli:sprinting (power): the player sprints whenever they move forward.
  • apoli:cooldown (item action): puts the item on cooldown, like an ender pearl after a throw.
  • apoli:aggro_at (bi-entity action): makes a neutral mob angry at a target.
  • apoli:heal takes a negative amount to remove health without a hurt flash or sound.

Compatibility

This release changes the network protocol, so the server and every player need 1.95.0 or newer.


1.94.1

Fixed — apoli:scale with several scale_types under Pehkui

With Pehkui installed, only the first type in the list applied; swapping the order swapped which one worked, and splitting it into two separate actions did not help. The hand-off to Pehkui only ran when the hitbox changed, and model_width and model_height never change the hitbox. Apoli now passes its scales to Pehkui whenever any of them changes, which also lets expression-driven scale powers reach Pehkui.


1.94.0

Performance — one sync per apoli:scale

The apoli:scale action sent the entity's full scale state once per listed type, so four types meant four packets. It now writes every type and sends one.


1.93.0

Fixed — boot crash with Clockwork

Apoli and Clockwork both used @Redirect on the same elytra check, and whichever mod lost crashed the game before the title screen (@Redirect conflict … Critical injection failure). Apoli now hooks that check in a way that combines with other mods in either order, so apoli:elytra_flight and Clockwork's gliders both work. The same change went to the other elytra and pose hooks that animation and cosmetic-wing mods tend to touch.

Fixed — apoli:crafting_table closed itself

The crafting grid it opened shut again on the next tick. It now stays open, shows the recipe result, and gives your items back when closed.


1.92.0

Fixed — apoli:walk_on_fluid sank you under Sable

With Sable installed, a water-walking origin sank to the seabed and could not swim back up, and striders on lava broke the same way. Apoli now answers the "can this entity stand on the fluid?" question the vanilla way when Sable is installed. A world without Sable keeps the stock collision path.

Fixed — apoli:prevent_sprinting did nothing

It loaded and never ran. A running sprint now stops and a new one cannot start, on any living entity.

Fixed — flight let survival players sprint on an empty stomach

Vanilla lets anyone who is allowed to fly sprint at any hunger level, so apoli:creative_flight meant infinite sprinting. That shortcut is now kept for creative and spectator mode only.

Added — conduits for water breathers on land

An active conduit gives Conduit Power to any entity that suffocates outside water, anywhere in its range (32 blocks for the smallest frame, 96 for a full one), even on dry land. Conduit Power already stops the suffocation, so a Merling can live ashore near a conduit.

Performance

apoli:walk_on_fluid no longer allocates on every fluid collision check, for every living entity.


1.91.0

Fixed — apoli:custom_model_render came apart when crouching under Entity Model Features

With Fresh Animations' Player Extension on Entity Model Features, overlays, emissive eyes and geometry jumped to standing height whenever the player sneaked. Apoli's extra draws of the player model made EMF run the pack's animation twice a frame, and the second run no longer recognised the crouch. Apoli now holds EMF's animation during its own draws, so the pack animates once per frame. Any CEM animation with smoothed values benefits, mob animations included.

Performance — no second copy of the CEM model

Apoli built its reference pose through the call EMF intercepts, so with a CEM pack it built a second copy of the pack's player model mid-render. It now uses the vanilla player mesh directly.

Type
Name
Game Versions
Mod Loaders
Size
Downloads
Uploaded