▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/Overgrown's Apoli
Overgrown's Apoli

Overgrown's Apoli

A data-driven power system that's build for custom abilities, mechanics, and entire origin systems from JSON alone.

Оцените первым
826
4
Все версииApoli (1.21.0)

Apoli (1.21.0)

Beta03.08.2026

Список изменений

Added

  • Per-face UV, including models that mix box UV and per-face UV cube by cube. Previously every face of a per-face cube was given the north face's UV, so anything not authored with Box UV checked was mis-textured.
  • Warnings instead of silence for duplicate bone names, unknown parent references, bone parent cycles, and uv_rotation (Bedrock format 1.21.0+), which is still unsupported.

If you built a model against the old behaviour: to attach geometry to a body part, build it around that part's pivot in Bedrock coordinates — head/hat/body at [0, 24, 0], arms at [±5, 22, 0], legs at [±1.9, 12, 0]. Everything else is now placed exactly where Blockbench shows it, relative to the player's feet.

  • apoli:suppress_power and apoli:unsuppress_power take arrays. power and source each accept a single identifier or a list, so one action replaces a stack of them inside an apoli:and. The plural spellings powers/sources work as aliases. Existing single-string packs parse unchanged.

Suppression is source-counted — a power stays off until every source that suppressed it is lifted — which is what makes multi-source arrays safe to combine.

Changed

  • Fabric builds moved onto the refreshed templates; only the Fabric API version had drifted.

  • Version alignment with Origins 1.9.2. No Apoli behaviour change.

  • NeoForge toolchain updated to ModDevGradle 2.0.143 and NeoForge 21.1.248.

Fixed

  • Per-cube rotation was discarded. Bedrock lets each cube carry its own pivot and rotation independently of its bone. Neither was read, so every rotated cube drew axis-aligned — a part modelled at 45° came out flat. Models built with rotated detail cubes looked like they had exploded.

  • Bones named after body parts were teleported onto the vanilla skeleton. A bone called head was moved to the vanilla head pivot, body to the model origin, the arms to (±5, 2, 0) — so a model authored standing on the Blockbench floor had its parts flung apart, and its height never matched the player. The vanilla animation is now applied on top of the pose you authored: a bone rotates about its own pivot and stays where you put it. A model built on the vanilla skeleton is unaffected.

  • Bone names are matched case-insensitively. Blockbench's default capitalisation (Head, RightArm) matched nothing, so on a typical model both pose-following and body_parts silently did nothing at all.

  • Bone-level mirror and inflate are inherited by cubes that don't set their own.

  • Suppression did nothing on apoli:multiple powers — the reason suppress/unsuppress looked completely broken. A multiple has no behaviour of its own; it all lives in the sub-powers the loader generates. Suppressing the id you actually know the name of therefore switched off nothing. Suppression is now effective: suppressing a power also suppresses everything it granted, at any depth. The actions, the commands, the codecs and the sync were all fine.

  • Suppressed powers left lasting effects behind. A suppressed power stops ticking, so anything it installed outside the container stayed applied forever: apoli:attribute modifiers, creative flight, and game-event listeners. Those three now undo and redo their state when suppression flips.

  • apoli:edible_item did nothing. The power type was registered and parsed, but nothing ever read it. It now works end to end: hunger and saturation, status effects, entity_action and item_action, result_stack, consume_sound, the eating animation and its duration — and it takes priority over vanilla food, so it can replace an existing food's behaviour rather than only adding food to non-food items. An omitted item_condition still means every stack, matching upstream.

  • apoli:raycast's command_at_hit only fired when the ray ended on a block. Any entity in front of the block silently swallowed it, and a ray with "entity": true, "block": false could never fire it at all. It now runs on the nearest hit of either kind. command_hit_offset (default 0) pushes back along the block's face for a block hit and back along the ray for an entity hit.

  • Speech-to-action works on NeoForge again, without reintroducing the 1.17.4 launch crash. JNA and Vosk now ship as plain resources, are unpacked on first use, and load in an isolated class loader, so they never become JPMS modules and can't collide with another mod's copy. Verified to still work with a foreign JNA already on the classpath (the ImmediatelyFast case).

  • apoli:player_model_type treated every unreported player as wide, so "model_type": "slim" could never pass and a wide/slim power pair only ever fired the wide half. The model type is now resolved in order from the client's own report, then the player's signed skin metadata, then vanilla's default-skin rule for their UUID. Vanilla clients, older Apoli clients, and players whose skin hadn't loaded yet are all handled.

  • A malformed optional field was dropped in complete silence. A typo in a nested field name, or broken escaping inside an SNBT tag, made the field vanish with no error — so a power ran unconditionally, or with no NBT filter, and the log said nothing. Apoli now logs a warning naming both the power and the field. It is a warning, not a hard failure, so one bad field can't drop a whole power on a live server.

  • SNBT parse errors now report the actual problem (Expected '}' at position 81: …) instead of the useless Expected NBT compound, got STRING.

  • Legacy origins:-namespaced action ids skipped their field defaults. The type resolved fine, which is why nothing showed in the log, but origins:replace_inventory decoded as operation: modify — a silent no-op. origins:drop_inventory and the three *_team aliases had the same problem; origins:set_no_gravity and origins:set_gravity failed to parse outright.

  • inventory_action with operation: replace could not fill an empty slot, which is the common use — putting an item into an empty offhand. modify and drop still skip empty slots.

Файлы

apoli-1.21.0.jar(28.19 MiB)
Основной
Скачать
apoli-1.21.0-dev.jar(2.07 MiB)
Скачать
apoli-1.21.0-sources.jar(703.69 KiB)
Скачать

Метаданные

Канал релиза

Beta

Номер версии

1.21.0

Загрузчики

Fabric

Версии игры

1.20.1

Загрузок

11

Дата публикации

03.08.2026

Загрузил

ID версии

Главная