Apoli (1.29.0)
Curse Maven Snippet
What's new
Added
apoli:attack_charge— a damage condition and an entity condition (same id, different kinds) that reads how far the attacker's attack-strength meter had recharged. Aliases:apoli:spam_attack,apoli:attack_cooldown. The defaults (comparison: "<=",compare_to: 0.9) mean "this hit was thrown before the meter refilled" — i.e. the player was click-spamming — and0.9is the same threshold vanilla itself uses to decide whether a hit earns a crit or a sweep. Add"inverted": truefor the opposite.compare_toaccepts an expression, so the threshold can be driven off a resource or attribute.Note that the damage-condition flavor is only ever true for player mêlée attacks. Projectiles, fall damage, mob attacks and damage dealt by other powers never record a charge, so it is
falsefor all of them — and thereforetruefor all of them once inverted. Pair the inverted form with an attacker or damage-type check when you mean "a properly timed mêlée hit".apoli:disable_slot— a power type that makes one or more inventory slots refuse items. It generalisesapoli:restrict_armorfrom the four armour slots to anything in the player's own inventory:hotbar.0–hotbar.8,inventory.0–inventory.26,armor.head/chest/legs/feet,weapon.mainhandandweapon.offhand. Takesslotand/orslots, plus an optionalitem_condition— with a condition only matching items are refused, without one the slot is sealed entirely. Alias:apoli:restrict_slot.A disabled slot is refused three ways: the GUI will not let you drop an item into it, item pickup routes around it, and anything already sitting there is ejected to the ground on the next tick — the same behaviour
apoli:restrict_armoralready had for armour.weapon.mainhandtracks the currently selected hotbar slot rather than a fixed index.apoli:change_slot— an entity action that swaps or moves the contents of two slots. Takesslot_a,slot_bandoperation(swap, the default, ormove). Works on the player inventory or on anapoli:inventorypower's container viainventory_type+power. Aliases:apoli:swap_slot,apoli:move_slot.movediscards whatever was inslot_b. Useswapunless you mean to delete it.apoli:change_selected_slot— an entity action that changes which hotbar slot the player is holding.slotis0–8, or an offset whenrelative: true(-1cycles left, wrapping around). Alias:apoli:set_selected_slot.override_poseonapoli:modify_model_parts— a list of entity poses whose vanilla animation is thrown away before the power'stransformationsrun, so an author writing, say, a swimming animation starts from the standing pose instead of layering on top of vanilla's swim stroke. Covers the model (swim stroke, crouch offsets, elytra lean, riding legs) and the body rotation the renderer applies forswimming,fall_flying,spin_attack,crouchingandsleeping.In-game settings screens for Apoli and Origins, reachable from Mod Menu, Catalogue and Menulogue without editing the config files by hand. Apoli's screen exposes every speech-to-action option (
apoli-client.json); Origins' exposes the GUI theme (origins.json). On NeoForge both hook NeoForge's own mod-list config button, which Catalogue also reads. Both mods now carry an icon in the mod list too.3D Skin Layers compatibility. Its extruded hat/jacket/sleeve/trouser layers now follow
apoli:model_color(whole-model and per-part, including alpha), disappear whenapoli:custom_model_renderorapoli:modify_player_modelreplaces the skin, honour thehiddentransform type ofapoli:modify_model_parts, and can be switched off withapoli:prevent_feature_renderunder the feature nameskin_layers_3d.Ears compatibility. Ears, horns, snouts, tails, wings and claws are tinted by
apoli:model_color(alpha included, so a fading player fades whole), and are hidden when a custom model replaces the skin, when the model is fully transparent, or viaapoli:prevent_feature_renderunderears— or per feature,ears_tail,ears_wings,ears_snoutand so on.Both integrations are compile-time-optional and gated on the mod being present, so nothing changes when they are not installed.
Fixed
- Delayed actions kept running for entities that no longer exist.
apoli:delayandapoli:loopcaptured the entities they were acting on and never re-checked them, andapoli:loopre-arms itself each interval — so a chain started by a summon carried on firing after that summon died, forever, and nothing could stop it. This is what was behind clones whose damage kept landing after they had visibly been killed, which/killcould not fix because the entity was already gone. Both actions now drop the rest of the chain the moment a participant is removed or changes dimension. Failures inside a delayed action are also logged now instead of being swallowed silently. - Summon lifetimes were reset by a chunk reload.
max_life_tickswas measured against a counter Minecraft does not save, so a clone or minion that survived its chunk unloading started its clock again and could live indefinitely. The remaining time is now saved with the entity. - Clones died instantly on Peaceful.
apoli:summon_cloneproduced an entity Minecraft treats as a monster, and monsters are removed on Peaceful before their "never despawn" flag is even consulted — so on a Peaceful world every clone vanished on its first tick regardless ofmax_life_ticks. Clones now survive Peaceful. /apoli:clone listnow reports each clone's remaining lifetime alongside its configured one.
Changed
- Suppressed powers are excluded from the tick list when it is built, rather
than being skipped one by one every tick. Holding a large number of dormant
powers now costs nothing per tick. Added batched suppress/unsuppress and
unsuppressAllFromSourceto thePowerContainerAPI for addons.

