Releases: KURONAMI333/isekai-api
Release list
Isekai v2.1.0
Three features that the documentation promised but the implementation never
delivered are now real: biome zones vary with the world seed, count_scale
thins structures, and TransitionRule blend/gap are evaluated.
No Java API breaks. Everything added is a default method or a new static,
so variants written against 1.x / 2.0.0 compile and run unchanged.
Changed — datapack behaviour
isekai_api:noise_thresholdandisekai_api:edge_jitternow vary with the
world seed. Their JSONseedfield is unchanged in shape but changed in
meaning: it was an absolute noise seed, and is now combined with the world
seed viaBiomeZone.deriveSeed. Two worlds made from the same datapack with
different seeds get different patterns; the same seed reproduces. Worlds
created before 2.1.0 will generate a different pattern in newly explored
chunks — finish or retire such a world before updating.- Combinators (
and/or/not) propagate the world seed to their children.
Purely geometric zones (always,y_above,y_below,y_between,
within_distance,beyond_distance) are unaffected by seed, as before. - A world's terrain shape is not seeded by this change. Density functions
built only fromisekai_api:distance/repeat/add/maxand constants
stay identical in every world; seed variation there comes from including a
vanillaminecraft:noiseterm, which the world seed already drives.
Added
structure_strategyacceptsisekai_api:count_scale. A factor below 1.0
deterministically thins vanilla structures from(world seed, chunk x, chunk z, structure id). It vetoes candidates atStructure.findValidGenerationPoint
rather than touchingRandomSpreadStructurePlacement.spacing: that placement
object is shared by every dimension referencing the structure set, and
ChunkGeneratorStructureStatecaches the candidate grid at world load, so
rescaling spacing would leak across dimensions and break seed reproducibility.
The consequence of the safer route is that structures can be made rarer but
not more common — a factor above 1.0 is a validation error, not a silent
round-down.TransitionRule.BlendandGapare evaluated at layer boundaries.
Blend(b)spreads the seam across ab-block band whose per-position choice
between the two descriptors ramps from 0 to 1, turning a flat seam into a
grainy gradient.Gap(g)leaves the topgblocks of the lower layer
unclaimed. Blend affects a descriptor's positional output —block_overrides
(surface_top,default_block) andstructure_predicates— not terrain
shape, and not ore/mob/feature remap (those select a layer by biome, not Y).BiomeZone.withWorldSeed(long)andBiomeZone.deriveSeed(long, long).
withWorldSeeddefaults to returningthis, so third-party variants keep
working; a third-party combinator that does not override it will not
propagate the seed to nested built-in noise zones.IsekaiRemap.getDescriptorAt(dimension, x, y, z)as adefaultmethod
delegating to the existing Y-only form.- A server-start warning when a rule biome source never received a world seed.
Changed — isekai_api:pool behaviour
pool used to carve, floor and fill unconditionally, so a basin that straddled a step
in the ground ended up with its water surface above the neighbouring ground and drained
over the lip. It now follows LakeFeature's shape: it tests the shell for solidity
before writing anything and returns without placing a single block when the site
cannot hold the fluid, it lines the whole shell with rim_block rather than only
the floor, and its outline is a union of several random ellipsoids instead of a
mathematical disc. The ice-capping pass is deliberately not ported — it calls
getBiome() up to 15 blocks out, which throws during worldgen.
No codec change: fluid / rim_block / xz_radius / depth are untouched and 1.x
datapacks decode unchanged. Placement gets rarer on uneven ground — measured at
roughly 2–6x fewer successes on rolling terrain, and a wider xz_radius costs more
than a deeper depth — so raise the rarity_filter chance rather than the radius if a
world wants the old frequency back.
Fixed
exclusions.featuresdid not hold. The REMOVE phase deleted the listed
features and the ore-remap ADD phase put them straight back: it re-injected
every snapshot feature whose placement exposed aHeightRangePlacement—
which is not only ores — and did so as an anonymousHolder.direct, with no
ResourceKeyfor any later pass to match. A world that excluded
minecraft:spring_waterstill generated springs, and nothing in the datapack
could remove them. Measured on a generated Sky World save: 437 water sources
and 18,247 lava sources across 9,409 chunks, all from excluded features.
REMOVE and ADD now derive their target set from one function
(impl/RemapTargets.select), so the two phases cannot drift apart again.
Carvers and structures were checked for the same shape and have no equivalent
path.additions.*is deliberately unchanged: naming the same id in both
additionsandexclusionsstill letsadditionswin, since that is an
explicit-versus-explicit conflict rather than an unrequested re-injection.IsekaiValidatorrejected every non-identitystructure_strategywhile its
own comment said it warned.- The layered-worldshape reader documented a file-level
"transition"field in
its javadoc;LayeredFilehas no such component and the key was silently
discarded. Thelayered_overworldexample wrote it, putblendon the
topmost layer (which has nothing above it), and used astructure_strategy
the validator rejects. README.mdreported 3SurfaceAnchorand 7RemapStrategyvariants; there
are 4 and 8. Its twoBiomeZonecounts disagreed with each other (9 and 11);
there are 11.examples/2_placement/moon_world/worldshape.jsonused the deprecated
isekai:prefix.tools/check_since.pyreadreturn foo(...)inside a method body as a
declaration.
v2.0.0
The rule-adaptation layer becomes an open extension point, terrain shape gets a
copy-free hook mechanism, and the library ships as a proper Gradle dependency.
Datapacks are unaffected. Every 1.x datapack loads unchanged: the isekai:
dispatch prefix is accepted as a deprecated alias (logs one warning per id), and all
existing payload schemas are byte-for-byte compatible. The breaking changes are on the
Java API only (see below) — this is a major bump because the SPI interfaces changed
shape, not because datapacks broke.
Breaking (Java API)
The five in-house dispatch interfaces — SpatialPredicate, RemapStrategy, BiomeZone,
SurfaceAnchor, TransitionRule — are now registry-backed extension points instead of
sealed codec unions:
sealedis removed from all five. Exhaustiveswitchstatements over their variants no
longer compile — handle them through their behavior methods or adefaultbranch.String typeId()is removed from all five. To recover a variant's registered id, ask
the registry:registry.getKey(variant.codec()). The registry keys live in
api/registry/IsekaiRegistries.- New abstract methods carry each interface's evaluation contract:
SpatialPredicate.test(EvaluationContext),RemapStrategy.remap(VerticalRange, RemapContext),
SurfaceAnchor.resolveY(PlacementContext, BlockPos). Custom Java implementations must
supply them.
Datapack authors and consumers who only use the built-in variants from JSON are unaffected.
Added
- Open SPI. Third parties register their own variant of any of the five interfaces from
their own mod id by adding aMapCodecto the matching registry in
api/registry/IsekaiRegistries— no fork, no PR. See
docs/DATAPACK_REFERENCE.md → "Extending the SPI". api/predicate/EvaluationContextandapi/remap/RemapContext— the world-access and
math seams that varianttest/remapimplementations receive.isekai_api:hooked_overworldpreset +hook/final_densitydensity function. A new
dimension references the preset and overrides one small hook file to change terrain shape —
no 2500-linenoise_settingscopy. A whole floating-island world is two files.
(README)- Terrain-relative ore remap —
isekai_api:column_local(RemapStrategy),
isekai_api:world_floor(SurfaceAnchor) andisekai_api:column_relative(placement
modifier). Every other remap strategy produces one absolute Y band per feature, which can
only ever be right for terrain at one altitude;column_localnormalizes a feature's
vanilla Y to a depth and resolves it against each column's own surface and underside as the
feature is placed. Floating islands, orbiting planets and sky continents get the same
internal ore layout whatever height they sit at.RemapStrategygained a
remapToColumn(VerticalRange, RemapContext)default method returning
Optional.empty(), so every existing strategy — built-in or third-party — keeps the
absolute behaviour unchanged. isekai_api:vanilla_overworld_surface— a delegateSurfaceRules.RuleSourcethat
reproduces the vanilla overworld surface rule, so overworld-replacement datapacks skip the
30 KB surface-rule copy.- Distribution as a Gradle dependency:
sourcesandjavadocjars, and a maven repo.
See docs/COMPATIBILITY.md.
Changed
- Dispatch prefix unified to
isekai_api:. All"type"values normalise to the
isekai_apinamespace; docs and examples use it throughout. - Inline
apply_worldshape/apply_worldshape_structuresmodifier forms are superseded by
the_refforms.
Fixed
isekai_api:worldshape_surface_topself-gates to the surface layer. Prepended bare into a
surface_rulesequence it replaces only the topmost surface block; the blocks beneath keep the
underlying surface rule's output. Nominecraft:stone_depthwrapper is required, and wrapping it
in one is harmless.
Deprecated
- The bare
isekai:dispatch prefix — accepted with a one-time warning, removed in the
next major. Rewrite"type": "isekai:*"to"type": "isekai_api:*". - Inline modifier forms — use the
_refforms. Same one-major grace.