
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
Список изменений
1.56.0
- New entity action
apoli:teleport, which also answers toapoli:teleport_to. It is/teleportin power form.x,yandzare Expressions and are read as an offset from the entity unlessrelativeis set to false, and that offset is oriented byspace, solocalwithz: 5means five blocks in front of wherever the entity is looking. It also takes an optionaldimension, optionalyawandpitch, alanding_block_conditionand alanding_condition,loaded_chunks_only, andsuccess_actionandfail_action. - The
landing_conditiononapoli:teleportand onapoli:random_teleportis 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. Onapoli:random_teleportthis 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_locationandapoli:teleport_to_location, together with the newapoli:has_locationentity 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_locationcan 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. Settingplayer_spawnto 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 throughspaceagainst the target so the actor can land beside or behind it rather than inside it. Settingswaptrades the two instead, andapoli:swapis 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 optionalentity_actionfires once per blocked attempt, andprevent_dimension_change, which defaults to true, decides whether portals and gateways count. A blocked teleport reports failure to whatever asked for it, so thefail_actiononapoli:teleport,apoli:random_teleportandapoli:teleport_to_locationstill runs and can explain why nothing happened. - Every teleporting action now goes through one shared helper. That is what makes
prevent_teleportand the failure hooks behave identically across all of them, and it is also what lets a cross-dimension teleport of a non-player hand itssuccess_actionthe 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:nothingis 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 theapoli:simplepower, 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:constantis still the one to use when you want to pick the answer. Data packs already usingapoli:nothingas an entity or bi-entity action are unaffected.apoli:disable_regenno 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 thenaturalRegenerationgame rule does, so nothing is spent. Starvation, exhaustion from other sources, and the food bar itself are untouched.- The
model_partfield onapoli:particleandapoli:spawn_particlesnow 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 thatapoli:modify_model_partsapplies 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_zand the velocity are read in the part's own frame whenevermodel_partis set andspaceis not written explicitly, which is what keeps an offset in front of the hand rather than pointing due south. Writingspaceopts back out and reads them the old way. Six new anchors were added —right_hand,left_hand,main_hand,off_hand,right_footandleft_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 optionalstackpunches with an item the actor does not have to own, held only for the duration of the attack but counted in full. The optionaldamage_typedeals the same amount under a different damage type, taking the direct route and skipping the rest of a real attack.swing_handcontrols 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_harvestgained astackfield. 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, andallowstill 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 … destroydoes, withdrop_lootcontrolling whether the loot table is rolled,stacknaming the tool it is rolled with, andbreak_particlescontrolling 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 noapoli:action_on_block_breakpower 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_angerruns itsbientity_actiononly 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_projectilespawns the projectile it resolves whicheverapoli:custom_model_renderpower 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
modelid 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_projectilegainedoffset_x,offset_yandoffset_zalong with aspacefield, controlling where the projectile appears relative to the shooter's eyes. Withspace: "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:particleandapoli:spawn_particlesgainedvelocity_x,velocity_yandvelocity_z, giving every particle an explicit direction instead of vanilla's random scatter.- Both of those also gained a
spacefield, and it applies to the existingoffset_x/offset_y/offset_zas 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, sooffset_z: 10meant ten blocks due south regardless of which way the entity was facing. - The
speedfield 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 throughspacelike everything else. - Both also gained a
model_partfield that anchors the particles to a body part —head,body,right_arm,left_arm,right_legorleft_leg— using the same part names thatapoli:model_colorandapoli:modify_model_partsalready 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
spreadto 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 numericspeed. - 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_effectapplied its status effects forever whenevermin_stackswas above zero. The stack count was clamped up tomin_stacksin 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_stacksis 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:overlaywas reworked. It gainedx,y,width,height,uandv— all of which accept expressions — plus ananchornaming which corner or edge of the screen those coordinates are measured from, andtexture_width/texture_heightfor 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:overlayalso accepts a list of overlays under anoverlaysfield, each with its owncondition. 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
conditionof its own. A power type's config is parsed from the same JSON object as the power's own fields, so an overlayconditionat the top level would have shadowed the power-levelconditionand evaluated it twice. Only entries insideoverlaystake a condition; on the flat form the power's own condition already does that job. apoli:custom_model_rendergeometry now renders on the custom projectile fired byapoli:fire_projectile, the same way it already renders on minions and clones. Grant the model power to the projectile from that power'sprojectile_actionand the projectile wears the model, oriented along its flight path, with its animations running for the whole flight.collectGeometrywas widened from living entities to any entity for this, with the equipment-hiding check skipped on entities that wear no equipment.- The
orderfield 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
#onapoli:customis 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#FFFFFF00parsed 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: a0x-prefixed string means0xAARRGGBB, 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:customgainedcolor_variation, which jitters each of the red, green and blue channels by plus or minus the given amount per particle, andhue_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 tocolorandend_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_xandoffset_y, measured in screen pixels from where the ring puts the slice, and ananglethat 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.RadialMenuEntrywas 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 nokeyslist 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 fromdata/<namespace>/keybinds/, every key-driven power type, andapoli: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 byapoli:force_key_pressedare not blocked unlessaffect_forcedis set, so a paralysed player can still be puppeted. apoli:rope_pullcan now drag a Sable sub-level. When the far end of a rope is anchored to an assembled structure,which: "other"orwhich: "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.speedis scaled by the structure's own mass first so it means the same thing it does on an entity, and a newsublevel_forcefield 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
distanceis 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:dimensionandapoli:time_of_daynow 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.
Метаданные
Канал релиза
Release
Номер версии
1.56.0
Загрузчики
Fabric
Версии игры
1.20.1
Загрузок
31
Дата публикации
31.08.2026
