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

Оцените первым
7.3K
7
Все версии→Apoli (1.56.0)

Apoli (1.56.0)

Release31.08.2026

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

1.56.0

  • New entity action apoli:teleport, which also answers to apoli:teleport_to. It is /teleport in power form. x, y and z are Expressions and are read as an offset from the entity unless relative is set to false, and that offset is oriented by space, so local with z: 5 means five blocks in front of wherever the entity is looking. It also takes an optional dimension, optional yaw and pitch, a landing_block_condition and a landing_condition, loaded_chunks_only, and success_action and fail_action.
  • The landing_condition on apoli:teleport and on apoli:random_teleport is now evaluated at the candidate destination rather than where the entity currently stands. The entity is staged at the destination, the condition is tested, and the entity is put back, so a condition like "the block at my feet is air" answers for the place the entity is about to be. On apoli:random_teleport this is a fix rather than a new behaviour: testing at the current position gave the same answer on every attempt, so the field either allowed all of them or none of them.
  • New entity actions apoli:save_location and apoli:teleport_to_location, together with the new apoli:has_location entity condition. A named position — coordinates, rotation and dimension — is stored per entity and survives a restart, so an origin can set an anchor and recall to it later, and the condition lets a power know whether an anchor exists before the key is pressed. teleport_to_location can clear the anchor as it uses it, which makes a one-shot recall. An entity keeps its thirty-two most recently saved names and the store keeps the four thousand most recently used entities, which bounds what a data pack can pile up by saving locations on short-lived mobs.
  • New entity action apoli:teleport_to_spawn, which sends the entity to its own respawn point, falling back to the world spawn when it has none or is not a player. Setting player_spawn to false always uses the world spawn.
  • New bi-entity action apoli:teleport_to. The actor arrives at the target, across dimensions if the two are in different ones, with an optional offset that is read through space against the target so the actor can land beside or behind it rather than inside it. Setting swap trades the two instead, and apoli:swap is the same action registered with that already turned on.
  • New power type apoli:prevent_teleport. It catches every route out: /teleport, the spectator menu, ender pearls, chorus fruit, enderman escapes, portals and end gateways, and every Apoli action that moves an entity. Its optional entity_action fires once per blocked attempt, and prevent_dimension_change, which defaults to true, decides whether portals and gateways count. A blocked teleport reports failure to whatever asked for it, so the fail_action on apoli:teleport, apoli:random_teleport and apoli:teleport_to_location still runs and can explain why nothing happened.
  • Every teleporting action now goes through one shared helper. That is what makes prevent_teleport and the failure hooks behave identically across all of them, and it is also what lets a cross-dimension teleport of a non-player hand its success_action the entity that actually arrived. Crossing dimensions replaces a non-player entity rather than moving it, so the original reference is dead by the time the action would run.

1.55.0

  • apoli:nothing is now a meta type rather than an entity and bi-entity action. The same id is registered as an action in all four action flavours — entity, bi-entity, block and item — as a condition in all seven condition flavours, and as a legacy id for the apoli:simple power, so "nothing happens here" reads the same wherever a type is expected. As a condition it always passes, which is what "no condition" means; apoli:constant is still the one to use when you want to pick the answer. Data packs already using apoli:nothing as an entity or bi-entity action are unaffected.
  • apoli:disable_regen no longer eats hunger while it is suppressing regeneration. It was implemented by skipping the healing call inside the food tick, which left the exhaustion that pays for that healing to be charged anyway, so a player with the power lost saturation and food at the regeneration rate while never gaining a single half-heart. The power now switches natural regeneration off for that player the same way the naturalRegeneration game rule does, so nothing is spent. Starvation, exhaustion from other sources, and the food bar itself are untouched.
  • The model_part field on apoli:particle and apoli:spawn_particles now follows the limb instead of marking a fixed spot on the body. The anchor tracks the pose the entity is actually in — walking and attack swings, crouching, riding, swimming and gliding — as well as the rotations, pivots and scales that apoli:modify_model_parts applies on top of them, so a particle placed at the hand stays at the hand when a power raises the arm.
  • Along with that, offset_x, offset_y, offset_z and the velocity are read in the part's own frame whenever model_part is set and space is not written explicitly, which is what keeps an offset in front of the hand rather than pointing due south. Writing space opts back out and reads them the old way. Six new anchors were added — right_hand, left_hand, main_hand, off_hand, right_foot and left_foot — which sit at the end of the limb where a held item is, rather than at the shoulder or the hip.
  • New bi-entity action apoli:punch. It makes the actor hit the target the way a real melee attack does, with the attack damage attribute, the held item's modifiers and enchantments, knockback, the sweep, the sounds and the on-hit enchantment effects, rather than dealing a number you choose. The optional stack punches with an item the actor does not have to own, held only for the duration of the attack but counted in full. The optional damage_type deals the same amount under a different damage type, taking the direct route and skipping the rest of a real attack. swing_hand controls the arm animation and defaults to true. For players the attack-strength cooldown applies and is reset, exactly as it would be if they had clicked.
  • apoli:modify_harvest gained a stack field. The block's loot table is then rolled as though the player had been holding that item, which is what the tool argument of /loot … mine <pos> <tool> does: Silk Touch and Fortune on it apply, and a mod's loot table that tests for a specific tool is satisfied by it. The player's real tool still takes the durability damage and still decides how fast the block breaks, and allow still decides whether the block drops anything at all.
  • New block action apoli:break_block. It breaks the block at the targeted position the way /setblock … destroy does, with drop_loot controlling whether the loot table is rolled, stack naming the tool it is rolled with, and break_particles controlling the break effect and sound. It is not a player mining the block, so no durability is spent, no block-mined statistic is awarded, and no apoli:action_on_block_break power fires for it, which also means nesting it inside that power cannot loop.
  • One thing was looked at and deliberately left alone: apoli:prevent_bee_anger runs its bientity_action only when a hive is harvested for honey, never when a hive is disturbed. The two paths were written differently and only one of them was ever wired to the action. It is documented as it behaves rather than changed.

1.54.0

  • A custom projectile now carries its model in its own entity data instead of looking it up through the power system. When apoli:fire_projectile spawns the projectile it resolves whichever apoli:custom_model_render power the projectile ended up holding and stamps that power's id into the entity's synched data, so the model arrives with the spawn packet and every viewer sees it on the first frame. Previously the renderer asked the client's own copy of the power container, which meant the model only appeared once a separate power-sync packet had landed — a race that a projectile living about a second could easily lose. Granting or revoking a model power mid-flight still works; the live lookup is used whenever nothing is stamped.
  • The custom projectile renderer falls back to drawing its flat texture when it has geometry but cannot draw any of it, for example because the model id points at a model that was never loaded. It used to render nothing at all in that case, which made a typo in the model id look like the entity had failed to spawn.
  • apoli:fire_projectile gained offset_x, offset_y and offset_z along with a space field, controlling where the projectile appears relative to the shooter's eyes. With space: "local" the offset turns with whoever is firing, so a projectile can leave the muzzle of a modelled cannon rather than a fixed point in the world.
  • apoli:particle and apoli:spawn_particles gained velocity_x, velocity_y and velocity_z, giving every particle an explicit direction instead of vanilla's random scatter.
  • Both of those also gained a space field, and it applies to the existing offset_x/offset_y/offset_z as well as to the new velocity. This is what fixes particles being impossible to place in front of an entity: the offsets were previously always read along the world axes, so offset_z: 10 meant ten blocks due south regardless of which way the entity was facing.
  • The speed field on both now accepts a vector as well as a number or an expression. A number keeps the old behaviour of scattering particles in random directions at up to that speed; a vector gives every particle that exact velocity, read through space like everything else.
  • Both also gained a model_part field that anchors the particles to a body part — head, body, right_arm, left_arm, right_leg or left_leg — using the same part names that apoli:model_color and apoli:modify_model_parts already accept. The anchor follows the entity's body rotation, its size and its crouching pose. It is a position on the body rather than a point on the animated bone, because the real bone position only exists on the client during rendering.
  • An explicit particle velocity is sent as one packet per particle, because the vanilla particle packet only treats its three distance fields as a direction when its count is zero. Apoli caps that at 64 packets per call and uses spread to jitter the spawn positions instead of the velocities, so a directed burst still looks like a burst. Large ambient clouds should keep using the plain numeric speed.
  • The network protocol version moved from 11 to 12 because the custom projectile entity gained a synched data slot. Those slots are positional and have no negotiation of their own, so a mismatched client and server now refuse each other loudly instead of quietly misreading the projectile.

1.53.0

  • apoli:stacking_status_effect applied its status effects forever whenever min_stacks was above zero. The stack count was clamped up to min_stacks in both directions, so it could never decay back to zero, and the effects were re-applied on every tick regardless of whether the power's condition still held. min_stacks is now the count the power jumps to while it is active only; while inactive the count falls to zero and the effects stop. This is what caused permanent weakness, mining fatigue and slowness for anyone holding a power like the Starborne pack's Starweaver curse.
  • apoli:overlay was reworked. It gained x, y, width, height, u and v — all of which accept expressions — plus an anchor naming which corner or edge of the screen those coordinates are measured from, and texture_width / texture_height for pulling one sprite out of a sheet. An overlay is now a placed, sized HUD element such as a counter, an indicator or a frame, instead of only a full-screen tint. Written with none of those fields it behaves exactly as it did before.
  • apoli:overlay also accepts a list of overlays under an overlays field, each with its own condition. Every entry whose condition passes is drawn, in order, which is the shape you want for a stack of status indicators. The single-overlay spelling is unchanged and still works.
  • The single-overlay spelling deliberately does not declare a condition of its own. A power type's config is parsed from the same JSON object as the power's own fields, so an overlay condition at the top level would have shadowed the power-level condition and evaluated it twice. Only entries inside overlays take a condition; on the flat form the power's own condition already does that job.
  • apoli:custom_model_render geometry now renders on the custom projectile fired by apoli:fire_projectile, the same way it already renders on minions and clones. Grant the model power to the projectile from that power's projectile_action and the projectile wears the model, oriented along its flight path, with its animations running for the whole flight. collectGeometry was widened from living entities to any entity for this, with the equipment-hiding check skipped on entities that wear no equipment.
  • The order field that 1.52.0 added to data-driven keybinds was removed again, along with the keybind-sorting mixin behind it. Sorting a Controls-menu category is entirely a matter of what the keybinds are called, since the screen sorts on the translated display name, so the machinery was unnecessary.

1.52.0

  • An eight-digit hex colour written with a # on apoli:custom is now read as #RRGGBBAA, with alpha last, the way a colour picker or a CSS file writes it. It used to be read as #AARRGGBB, so #FFFFFF00 parsed as fully opaque and silently zeroed the blue channel instead — which is why the last two digits appeared to do nothing to a particle's transparency. The Java packed-integer order is still available and unchanged: a 0x-prefixed string means 0xAARRGGBB, and so does a bare integer. Six-digit hex and float lists are untouched. Any eight-digit # colour written before this needs its first pair moved to the end.
  • apoli:custom gained color_variation, which jitters each of the red, green and blue channels by plus or minus the given amount per particle, and hue_variation, which rotates the whole colour by plus or minus the given number of degrees. Both are rolled once when a particle spawns and applied identically to color and end_color, so every particle still runs the same fade, just from its own shade.
  • The particle tint is now precomputed into eight floats when a particle spawns rather than being unpacked from two integers on every tick. This is a hot path — it runs per particle per tick — and the new version is four interpolations and nothing else.
  • Radial menu entries gained offset_x and offset_y, measured in screen pixels from where the ring puts the slice, and an angle that overrides the automatic even spacing. Together these allow arcs, columns, crosses and rows instead of only a full circle. The offsets are scaled by the menu's bloom animation, so a displaced slice still flies out from the centre rather than snapping into place. RadialMenuEntry was already at the sixteen-field limit of the codec builder, so it was restructured onto a paired codec to make room.
  • New power type apoli:prevent_key_press. With no keys list it stops the holder's entire keyboard and mouse from reaching the game — no movement, attacking, item use, inventory or ability keys — which is the stun or paralysis effect people otherwise build out of a pile of attribute modifiers. With a list it blocks only the keys you name. It works at the keybind level, so it covers vanilla controls, data-driven keybinds from data/<namespace>/keybinds/, every key-driven power type, and apoli:key_pressed, which reads a blocked key as not held. The server refuses blocked keys as well, so it is not a client-side honour system. Escape is never blocked. Keys held by apoli:force_key_pressed are not blocked unless affect_forced is set, so a paralysed player can still be puppeted.
  • apoli:rope_pull can now drag a Sable sub-level. When the far end of a rope is anchored to an assembled structure, which: "other" or which: "both" applies a physics impulse to that structure's rigid body at the block the rope is tied to, so a rope on the bow swings a ship as well as pulling it. speed is scaled by the structure's own mass first so it means the same thing it does on an entity, and a new sublevel_force field multiplies that impulse per rope.
  • A rope endpoint anchored to a Sable sub-level is now converted to world space through the structure's render pose on the client rather than its logical pose, which makes the anchor track a moving structure smoothly instead of stepping once per tick.
  • A rope raycast that lands on a block but resolves further away than the raycast's own distance is now discarded rather than anchored. Sable answers a ray in the sub-level's own plot coordinates, so when that mapping back to world space fails the raw hit is tens of thousands of blocks away; the result was a rope stretched across the map instead of an obvious failure.
  • apoli:dimension and apoli:time_of_day now read the level the entity is actually standing in rather than the ambient level carried on the evaluation context. The two are usually the same object but not always, and these were the only two level-reading entity conditions that could disagree with where the entity really was. This was reported as an origin behaving in the overworld as though the player were in the nether.
  • The network protocol version moved from 10 to 11 for the new radial menu entry fields.

Файлы

apoli-1.56.0.jar(28.99 MiB)
Основной
Скачать
apoli-1.56.0-dev.jar(2.87 MiB)
Скачать
apoli-1.56.0-sources.jar(989.34 KiB)
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.56.0

Загрузчики

Fabric

Версии игры

1.20.1

Загрузок

31

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

31.08.2026

Загрузил

ID версии

Главная