▶️ ЗАБЕРИ СВОИ 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.12.0)

Apoli (1.12.0)

Beta31.07.2026

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

Added

Scoreboard teams

  • apoli:in_team: Entity Condition (alias apoli:team). Takes team / teams, each either a team name or an object of properties to match. With neither, it just asks "is this entity on a team?".
  • apoli:same_team: Bi-Entity Condition (alias apoli:allied), with allow_teamless.
  • apoli:team: Entity Action with an operation of join, leave, create, modify, empty or delete; the /team command as a data-pack action. apoli:join_team, apoli:leave_team and apoli:modify_team are aliases that preset the operation.
  • New Team Data Type, used by all three. Eggolib's camelCase field spellings (friendlyFire, nametagVisibility, …) are accepted, so eggolib:in_team JSON loads unchanged. One difference: a multi-field object here requires all of those properties to match, where Eggolib passed if any single one did (use teams for the old behaviour).

Speech to action has been reworked end to end:

  • Transcription is now fully in-house and offline, using a bundled Vosk recogniser. The local web server and browser tab are gone.
  • With Simple Voice Chat installed, Apoli reads the audio it has already captured on your machine, before it is encoded. No second microphone, no device conflict, and your own push-to-talk is the gate. Without it, Apoli opens the microphone itself behind a new Speech to Action keybind.
  • Recognised text never leaves the client. Matching happens locally; only "power X matched" is sent, and the server re-checks that you hold it before running the action.
  • New client options in apoli-client.json: speechSource, speechInstant, speechPushToTalk, speechInputDevice, speechEcho.

Key sequences timeout (default 20 ticks) forgets a partial combo after inactivity.

Power sources

  • New concept: a power source is anything that owns a list of powers: an origin, an origin layer, a skill tree, or an apoli:multiple power. Apoli can now resolve a source id to its powers, which is what makes "grant everything this origin has" possible.
  • apoli:grant_all_powers gained from (a single id or a list). It grants only the powers those sources provide. source is now optional and defaults per entry to the from id, so apoli:revoke_all_powers with the same id undoes the grant exactly.
  • apoli:revoke_all_powers source accepts a list, and now also resolves real power sources removing those powers completely, sub-powers included, whichever source granted them.

Commands

  • /apoli:power remove and removeall, aliases of revoke and revokeall.
  • /apoli:clone: summon, remove and list for player clones, the same entity apoli:summon_clone creates. Options are one NBT compound: count, lifetime, can_attack, can_sit, follow_owner, slim, inherit_equipment, powers, summon_id, wide_texture, slim_texture. No short alias since /clone is vanilla. Permission node apoli.command.clone.
  • /apoli:skill_tree points remove <targets> <tree> <value>, next to points add.

Entity selector options

  • @e[power=<id>]: Entities holding a power. Works on any entity, not just players.
  • @e[suppressed_power=<id>]: Entities holding a power that is currently suppressed.
  • @a[skill=<id>]: players who purchased a skill.
  • @a[origin=<id>] and @a[origin_layer=<id>] (needs Origins installed; without it they produce a clear error rather than silently matching nothing).
  • All five accept ! for negation and offer tab-completion.

Raycast

  • apoli:raycast is now registered as a bi-entity action as well (type alias apoli:raycast_between). In that form the ray is cast from the actor's eyes straight at the target and clamped to the distance between them — the "is there a wall between us" trace, or a particle line drawn between two entities.
  • aim_at_target (default true) and stop_at_target (default true) control that. An explicit direction still wins.

Fixed

  • apoli:action_on_key_sequence combos no longer trigger each other. Two problems: a power only saw key presses from its own keys list, so an unrelated key could not break a partial match; and powers matched independently, so finishing A B C also fired A B on the way through. All of a player's sequences are now matched in one pass and only the longest match fires — a shorter combo waits while a longer one is still reachable, and is cancelled if that longer one completes.
  • /apoli:resource reported resources you no longer had. A resource's value is kept after the power is revoked so re-granting restores it, but every sub-command read that raw value without checking you still hold the power. Tab-completion now suggests only what the targets actually have.
  • Powers from a previous origin could leave their effects behind. When a power's definition is missing at removal time its onRemoved cannot run, so attribute modifiers stayed applied. Those are now stripped explicitly. Relatedly, the client no longer replaces the shared power table in single-player, where a client-side parse failure could delete a definition the server still needed, and client parse errors are logged instead of being swallowed.
  • Disguises are animated. The stand-in model is now ticked, so walking, attacking, hurt, death and pose all follow the disguised entity; Iron Golem and Warden attack animations play, and fire shows through. The disguise stays silent.
  • apoli:model_color applies to disguises. The colour was looked up on the stand-in model, which holds no powers, so it silently did nothing.
  • apoli:modify_cursor_speed hooks the single place the camera turn is applied instead of rewriting the mouse handler's internals, so other input mods can no longer bypass it.
  • A crash in the server tick loop: apoli:resource boundary actions dereferenced a living-entity owner that is null for non-living power holders. The same pattern was fixed in seven other power types.
  • Skill trees that keep their skills as files loaded zero skills. Every file in data/<namespace>/skill_trees/ was parsed as a tree, so a pack using the classic layout — one file per skill, carrying parent, power, cost and conditions — ended up with a folder full of empty auto-granted trees and nothing to buy. Points went into keys nothing read, buy reported "unknown skill", and the whole feature looked dead. A file in skill_trees/ is now a skill when it has a parent and a tree when it does not. That one field is the whole rule. Both layouts work and end up in the same tree; skills declared in a power's skill block still win on an id collision. A skill file's power is accepted as well as powers.
  • Empty or malformed files in skill_trees/ are now skipped with a message naming the file instead of failing with an opaque codec error.
  • Revoking a power left its sub-powers behind. removePowerCompletely deleted the container entry without running the power type's removal hook, so revoking an apoli:multiple power orphaned every sub-power it had granted. It now runs the hook for each source and sweeps anything still held under that power as a source. This affects the apoli:remove_power action and the revoke command.
  • tick_bientity_action now keeps firing on dedicated servers. Fired projectiles were tracked by hard object reference. Whenever the projectile object was momentarily unresolvable — the tick after it is spawned but before it is visible to the level's entity index, or after a chunk unload / reload swaps it for a fresh instance from NBT — the tracking entry was dropped permanently and that projectile never ticked again. Projectiles are now tracked by UUID and re resolved against the server's levels, with a short grace window, so unload / reload and spawn-tick races no longer end tracking. Single player rarely hit this because the shooter's chunks stay loaded and projectiles die on impact within a second.
  • One failing tick action no longer stops every other projectile. The tracking list was rebuilt in place while iterating, so an exception from any single tick_bientity_action discarded every entry that had not been visited yet — killing per-tick actions for all players at once. Failures are now contained to the projectile that caused them and logged once.
  • The actor passed to tick_bientity_action survives respawn and dimension changes. The shooter was captured as an object reference; once the server replaced that player instance the action received a null actor for the rest of the projectile's life. The owner is now re-resolved by UUID, so actions that read the shooter keep working. This mostly showed up in multiplayer, where respawns and portals are constant.
  • Powers that fail to re-encode for client sync are now reported. A power whose config could not be written back to JSON was dropped from the sync silently, so it worked on the server but was invisible to every client — with no clue in the log. The failure is now logged with the power id and the codec error.

Changed

  • /apoli:power rewritten. The tree is now grant, revoke, grantall, revokeall, has, suppress and unsuppress. The power alias is unchanged.
  • revoke <targets> <power> removes the power completely — every source that granted it, plus its sub-powers. Add from <source> to drop only one grant.
  • Sub-powers are named <parent>_<key>, so typing example:fire_ tab-completes the ones you can target individually.
  • grantall / revokeall take a power source (origin, layer, skill tree or apoli:multiple power) instead of meaning "everything".
  • has <targets> with no power id lists every power the target holds, with the sources that granted each and a marker on suppressed ones. With an id it prints true/false per target and returns the match count.
  • suppress / unsuppress take a power <id> or a key <keybind> mode — the key mode switches off every held power bound to that key at once, which is useful for packs that stack a dozen abilities on one button. unsuppress <targets> all clears the lot.
  • Removed: remove (it was revoke with extra steps), clear, list, sources and dump.
  • apoli:raycast's pierce is now a shorthand for two separate flags, pierce_blocks and pierce_entities. Setting pierce still sets both, so existing packs are unaffected; setting either explicitly overrides it. Lasers can now go through walls or through crowds without having to do both.
  • Commands validate the ids they are given and report what is loaded when one is wrong, so a typo can no longer look like a broken command.

Файлы

apoli-1.12.0.jar(28.12 MiB)
Основной
Скачать
apoli-1.12.0-dev.jar(2.00 MiB)
Скачать
apoli-1.12.0-sources.jar(676.63 KiB)
Скачать

Метаданные

Канал релиза

Beta

Номер версии

1.12.0

Загрузчики

Fabric

Версии игры

1.20.1

Загрузок

23

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

31.07.2026

Загрузил

ID версии

Главная