Apoli (1.115.0)
Curse Maven Snippet
What's new
1.115.0
Added — draw a path for reach. Model part keyframes can carry a target: the hand or foot follows the points in order, and catmullrom easing bends them into a smooth curve, so one transformation can animate a sword slash, a wave or a wind-up. A keyframe sets a value, a target or both (they are separate tracks), and a reach whose keyframes give points no longer needs its own target. A keyframe with neither, or a non-reach keyframe without a value, is a load error naming the keyframe's time.
Fixed — reaching hands missed each other in first person. Each first-person arm read target through its own view, so two arms reaching for one point crossed over on screen. A first-person reach now measures target from the shoulders Minecraft draws, in the frame of the third-person body: both hands land on the same point, the arms keep about their third-person length, and the hands turn the way they do in third person. A first-person reach tuned by eye on 1.113 or 1.114 lands somewhere new.
Added — a reaching hand holds its item in first person. The item sits in the hand, gripped the way it is in third person, instead of where Minecraft normally draws it, and held-item edits with first_person in perspectives turn it there. While that hand is using its item — eating, drawing a bow, blocking — the item goes back to its usual place. Arms edited in other ways are still drawn beside the item.
Fixed — first-person hand particles on edited arms. Particles anchored to a hand sat where Minecraft draws the held item even when an edited arm was drawn somewhere else; they now follow the drawn hand, and stay still with a held reach.
1.114.1
Fixed — a held reach still moved after a real attack. With override_animation on a reach, the swing was stopped but a real attack (or switching items) still made the first-person hand dip down and come back up — the attack-cooldown "re-equip" animation. A held arm now skips that too, so it and its item stay put. Eating, drinking and drawing a bow still play their own animations.
1.114.0
Added — override_animation holds a reaching arm still. On a reach model part transformation, "override_animation": true stops that arm swinging when the holder attacks or uses an item — in first person too, where the arm used to swing away from its point. The item in that hand stops swinging with it, and apoli:show_both_arms ghost arms skip the arm. Without it, the first-person arm swings from its reach pose as before.
Added — edited arms are drawn in first person. An arm that apoli:modify_model_parts edits in the first_person view is now always drawn there: beside the item its hand is holding, and the off arm as well as the main arm. Visibility edits and held-item edits don't count.
Performance — the first-person swing hook no longer allocates. It used @ModifyArgs, which built an argument array twice a frame.
1.113.0
Fixed — scaled name tags floated far above the head. With apoli:height (or anything that scales the model) a name tag drifted well above the entity and was stretched. Name tags now sit just above the drawn head at their normal size, including for scales that only change the model or only the hitbox.
Fixed — sleeping while scaled. A big sleeper was pushed most of the way off the bed and sank into the floor, and a tall, thin one lay short and thick. Scaled sleepers now lie on the mattress with their head on the pillow, and apoli:model_height stretches the body along its length in every pose — lying, swimming, gliding, dying.
Fixed — leads on scaled mobs and boats stretched off into the sky instead of reaching their holder, and crouching while scaled left the feet hovering.
Added — the inventory doll keeps its size, and apoli:doll sizes it. The preview in the inventory and other menus ignores every scale, so a giant or a tiny player can see themselves. The new apoli:doll scale type is the one that reaches it: {"type": "apoli:scale", "scale_types": "apoli:doll", "scale": 2}.
Added — ghost arms in third person. apoli:show_both_arms ghost arms now trail the swinging arms on the body, so other players see them, and so does the holder in third person, previews and camera powers. Both arms leave a trail when apoli:swing_hand swings them together. New field ghost_perspectives (first_person, third_person; default both).
Added — held items in apoli:modify_model_parts. right_item, left_item, main_hand_item, off_hand_item and items turn, grow, move or hide the items in an entity's hands, in third person and (with first_person in perspectives) in first person.
Added — reach. A new model part transformation type that points a limb at a target point and stretches or shortens it so the hand or foot lands exactly there. On arms the two hands meet:
{
"model_part": "arms",
"type": "reach",
"target": [
0,
8,
-8
]
}
The server works out the same pose, so particles on a hand and body-part hits follow it.
Added — apoli:transfer_effects (bi-entity action). Steals, gives or copies status effects between actor and target — custom status effects included, with their powers. Filter by effects (ids or #tags) and category, change the duration and amplifier on the way with duration_modifier / amplifier_modifier, and split an effect between the two with copy and donor_duration_modifier.
Changed — paired swings on the server. When both hands swing together, the server-side pose now raises both arms too, so particles on the off hand and body-part hits match what players see.
1.112.0
Added — the key that opens a radial menu or power inventory closes it. An apoli:radial_menu opened from a key press and an apoli:inventory close when that key is pressed again, like the inventory key. The key must be let go first, so holding it never closes the screen it just opened. A radial menu opened by picking a slice of another one closes on the first menu's key. The radial menu also closes on the inventory key now. If a power inventory's key is a hotbar number, swap offhand, drop or pick block, pressing it over a slot still does the slot action.
Added — dev mode reports damage changes. With /apoli:dev_mode on, every hit an apoli:modify_damage power (or modify_damage_dealt / modify_damage_taken) changes prints the damage before and after, the damage type and the powers involved on each side: Pig: damage 6 → 4 (minecraft:mob_attack) · dealt: example:strong (Steve) · taken: example:tough. At most one line every half second per victim and attacker.
Fixed — the missing-shader warning printed the wrong path. For "shader": "example:shaders/post/sketch.json" the log said assets/example/shaders/post/shaders/post/sketch.json.json was missing. It now names the file the game looked for, and explains the expected namespace:shaders/post/<name>.json form when the field isn't written that way.
1.111.0
Fixed — apoli:replace_loot_table never replaced anything. It loaded without errors but nothing applied it. It now replaces loot from killed mobs, broken blocks, opened chests, fishing and piglin bartering on every loader, apoli:replaced_loot_table inside a replacement rolls the table it replaced, and priority orders several replacements of the same table. A key in replace that isn't a valid regular expression is now a load error naming it, and a replacement table that doesn't exist is skipped with a warning.
Fixed — particles anchored to a body part missed the part. apoli:spawn_particles and apoli:particle with a model_part estimated the pose on the server, and the estimate fell out of step with apoli:modify_model_parts animations — the first particles of an animation sat at the resting pose (by your side), later ones ran ahead of it — and the holder in first person never saw particles at their hand. Each player's game now places the particles on the part as it draws it for them: in step with keyframe animations, on poses from Better Combat, Iron's Spells & Spellbooks and other playerAnimator mods, and at the hand on screen (the bare hand or the held item) for the holder in first person. Clients on an older Apoli get the previous server-side placement.
Fixed — a first-person pitch from apoli:modify_model_parts did nothing. Minecraft levels the arm right before drawing it in first person, which threw the pitch away. First-person pitch animations now play.
Fixed — Better Combat and Iron's Spells & Spellbooks drew the whole body in first person. With any apoli:modify_model_parts power active, Apoli restored every model part's visibility before posing the model, undoing the part hiding those mods (through playerAnimator) use for their first-person animations, so the head and body were drawn over the camera. visible/hidden edits now only touch the parts they name and are undone after the model is drawn. The same restore also gave spectators a full body instead of a floating head and overrode skin-layer toggles.
Network — NeoForge protocol version 15. Anchored particles travel as a new payload; NeoForge clients and servers must both be on 1.111.0. Fabric negotiates the new payload per player.
Performance — anchored particles. The server no longer estimates a body pose per particle burst for players running 1.111.0; it sends one small payload per viewer instead of up to 64 particle packets.
1.110.0
Added — the classic post-processing shaders on 1.21.1. Minecraft 1.21.1 removed twenty of the old "Super Secret Settings" shaders. Apoli ships them again, so minecraft:shaders/post/<name>.json works for antialias, art, bits, blobs, blobs2, bumpy, color_convolve, deconverge, desaturate, flip, fxaa, green, notch, ntsc, outline, pencil, phosphor, scan_pincushion, sobel and wobble in an apoli:shader power, exactly as on 1.20.1. The game's own blur, entity_outline and spider are untouched.
Fixed — apoli:punch crashed the server when the actor had no attack damage. A ghast, a pig or an armor stand throwing a punch (easy to reach through apoli:invert) threw "Can't find attribute minecraft:generic.attack_damage". Such an actor now punches for the attribute's default of 2, plus the attack damage modifiers and enchantments of the item it punches with.
Fixed — a see-through apoli:model_color player vanished from the inventory screen with Fabulous! graphics.
Performance — apoli:model_color. Each entity's colours are worked out once per frame instead of up to four times, entities without the power skip the work entirely, and nothing is allocated per entity per frame (3D Skin Layers, Ears and Icarus wings read the same result).
1.109.1
Fixed — apoli:action_on_kill only fired when the victim had powers. Killing something that had never held a power — a plain skeleton, most mobs — ran nothing, so the power appeared to do nothing in an ordinary world. It now fires for every kill, whatever was killed, including powers written under the legacy self_action_on_kill id.
Fixed — a player disguised as another player kept their own arm model. The disguise swapped the skin but not the slim/wide model, so a wide-armed player disguised as someone with a slim skin was drawn with wide arms and the skin didn't line up (and the other way round). The target's model is now used in third person, on your own first-person hand and in the inventory preview.
Fixed — custom projectile models faced the wrong way. A projectile wearing a custom_model_render geometry model only faced forward when fired north or south: east or west it flew backwards, pointing at the shooter, and diagonally it flew sideways. It now faces its direction of travel in every direction, pitch included, with or without Flywheel. The side Blockbench labels north leads; if you turned a model around to compensate, turn it back.
Fixed — apoli:model_color alpha did nothing on the first-person arm. The arm is now drawn see-through when its alpha is below 1, and it matches the third-person body: a 0.5 arm is half see-through, without the inside of the arm showing through it.
Performance — less work per death and per frame. action_on_kill finds the killer's kill powers through the power type index instead of checking every power the killer has, on every kill. Disguise lookups that run for every entity every frame no longer allocate while nobody is disguised.
1.109.0
Fixed — apoli:tooltip never added anything to a tooltip. It loaded without errors but nothing called it. It now adds its lines on every loader, only for the player who has the power.
Added — position field on apoli:tooltip. "below_lore" (default) puts the lines after the item's description, enchantments and lore, above the attribute modifiers; "below_name" puts them directly under the item's name. order still sorts lines from several powers that share a position. A misspelled position logs a warning and falls back to below_lore.

