AkumaLib 2.1.0
Curse Maven Snippet
What's new
AkumaLib 2.1.0
Six additions since 2.0.0. Everything here is additive — no existing signature moved, so an addon built against 2.0.0 keeps compiling. That is why this is a minor bump.
Requires Minecraft 1.20.1, Forge 47+ and Mine Mine no Mi 0.11.5.
New
MorphGates — a factory for requiresMorph conditions
Every ability locked to a form was writing the same use-condition by hand, and a form gate that is subtly wrong fails in the worst possible way: the ability is simply usable out of shape, which nothing logs and nobody notices until somebody tries it. One addon had eleven such copies. They are now one constant each.
MorphStats — a builder for a morph ability's attribute block
A Zoan form is mostly a wall of attribute modifiers — speed, armour, knockback resistance, step height, jump height, reach — and the base mod's own morphs write them out longhand. This builds the block instead, which makes two forms of the same fruit readable side by side and stops the modifier UUIDs being copy-pasted between them.
onlyWhile(...) adds a conditional block: a set of modifiers that applies only while some
predicate holds, so a form that is faster in water or heavier on land is one declaration rather than
a tick handler.
AkumaTargeting — the target-picking helpers
Consolidates the entity selection every ability was reimplementing, and — more usefully — documents which of them exclude the caster and which do not. That distinction had already produced two shipped bugs in a consumer, where a technique with a radius damaged the person who used it.
AmplifiedPresentation and the amplification bus
The pattern where a form amplifies its own fruit's kit — the base mod does it with Venom Demon and Shinokuni — has three axes: the numbers, the shape of the technique, and its name and icon. The third is pushed once by the form rather than polled by each technique, and that is the part a sixth ability in a kit forgets.
AmplificationBus.push(entity, amplified, ...abilities) is the whole of the wiring;
IAmplifiableAbility and AmplifiedPresentation are what a technique implements to answer.
MarkerEffect — a base for effects that are read, not felt
An effect that exists only so something else can ask about it has no per-tick work, and saying so
matters: returning true from isDurationEffectTick asks the game to tick it every single tick for
nothing. It also settles the client-visibility override that, left at its default, makes an effect
exist only on the server — so the overlay is never painted and the failure looks like the colour
being wrong rather than like the effect being invisible.
OverlayEffect — a marker that also tints the body it is on
Adds the body tint on top of MarkerEffect. ⚠️ The alpha has to be spelled out: new Color(rgb)
fills it in at 255, which paints the body a flat silhouette with no skin left underneath. Two
calibrated values are documented on the class — around 100 for something the user wears and has to
stay readable through, around 150 for a mark whose whole job is to be impossible to miss.
⚠️ The amplifier on such an effect is not always a potency. An instance carries a duration and an
amplifier and nothing else, so it is the only place a per-application value can travel — one consumer
puts a DyeColor id there, which is what makes sixteen colours one registered effect instead of
sixteen.
Documentation
Three corrections, each of which had already cost somebody a wrong answer:
ModAttributes.STEP_HEIGHTis an alias, not an inert attribute. It resolves to Forge's own, so writing to it works and reading the Forge one back reflects it.- What does and does not exclude the caster, spelled out per helper rather than left to be discovered by damaging yourself.
- Only one of
MarkerEffect's four overrides was ever load-bearing — the other three restate defaults, and the class says which is which so a subclass knows what it is actually inheriting.
Notes for addon developers
- Bump your
akumalib_versionto2.1.0so yourmods.tomlrange refuses an older library rather than loading against one and crashing during registration. gradlew buildleaves a mapped jar inbuild/libs; the distributable comes fromgradlew releaseJar, inbuild/release. The two are indistinguishable by eye, and shipping the mapped one produces a mod that loads and then fails on its first Minecraft call.- Consumers resolving AkumaLib from Maven need
gradlew publishToMavenLocalin this checkout first. - ⚠️ Run the control build before releasing anything that depends on this. The composite build
(
includeBuild('../AkumaLib')) puts this project's classes on the classpath directly, which hides a resource missing from the packaged jar completely — a lang file, a texture,mods.tomlitself.gradlew build -PakumalibFromMavenin the consumer is the only build that would catch it.
This mod has no additional files

