isekai-api-3.0.0-neoforge-1.21.1
Curse Maven Snippet
What's new
Breaking changes
- Mob spawn changes are dimension-scoped.
exclusions.mob_spawns,additions.mob_spawns,mob_spawn_strategyandmob_spawn_strategy_by_categoryused to rewrite the shared biome's spawn builder; they now apply only in the descriptor's dimension. The same biome in another dimension keeps its original list. - Carver exclusions and additions are dimension-scoped on noise-based dimensions.
exclusions.carversandadditions.carversnow apply only in the declared dimension when its generator is aNoiseBasedChunkGenerator. Dimensions with another generator keep the old biome-wide edit (see limitations). - Other mods' features follow the declared scope. A feature another mod adds to a declared
biome is removed from the shared biome and re-injected as a guarded copy for the declaring
dimension. Dimensions that do not declare the worldshape no longer receive it
(
ForeignFeatureReconciler). - Internal signatures changed (
@ApiStatus.Internal, no compatibility promise):ModifyPhase.mobSpawnStrategy(WorldshapeDescriptor, Holder<Biome>),RemovePhase.excludedCarvers(WorldshapeDescriptor, ResourceKey<Biome>, …)andAddPhase.additionalCarvers(WorldshapeDescriptor, ResourceKey<Biome>, …). - 2.x datapacks load unchanged, but the scope changes. The same JSON now affects one dimension instead of every dimension that shares the biome. A pack that relied on the old cross-dimension leak must declare a descriptor for the other dimension.
ClientAtmosphereOverridegained askyColorcomponent. The record is now(skyColor, fogColor, fogNearDistance, fogFarDistance); the three-argument constructor is gone. Source callers passOptional.empty()forskyColor, and compiled callers must recompile.
Added
- Per-dimension feature drop at decoration time.
ChunkGeneratorDecorationMixinredirectsgenerationSettingsGetter.apply(biome)inChunkGenerator#applyBiomeDecoration;DimensionFeatureScoperemoves the recorded takeover set for the dimension generating the chunk. The set is recorded by the ADD phase, so the drop and the injected copy always agree. - Final feature veto for custom generators.
PlacedFeatureScopeMixininjects atPlacedFeature#placeWithContextHEAD and rejects the same takeover values, so a generator that overridesapplyBiomeDecorationwholesale also honoursexclusions.features,feature_predicatesandore_strategy. - Injected features carry
isekai_api:dimension_guard.additions.features, remap copies andfeature_predicatescopies place only in the descriptor's dimension. - Structure exclusions are dimension-scoped.
StructureFindValidGenerationPointMixinvetoes during generation-point search. During chunk generation the dimension comes fromChunkDimensionIndex(a weakProtoChunk→ dimension index);/locateand/placeuse the level directly; only an index miss falls back to matching theBiomeSource. - Mob spawn rules are enforced at the runtime read points.
MobSpawnScopeholds a per-(dimension, biome) rule.NaturalSpawner#mobsAt(RETURN) andspawnMobsForChunkGeneration(getMobsredirect) filter the list;MobSpawnVetoHandlercancels atFinalizeSpawnEvent(LOWEST) for paths that never read a list, so an exclusion also covers patrols, spawners, spawn eggs and/summon. - Carver rules are enforced at carve time.
NoiseBasedChunkGeneratorCarverMixinredirectsChunkAccess#carverBiomeinNoiseBasedChunkGenerator#applyCarvers;CarverScopeapplies the recorded add/remove rule per (dimension, biome). client_atmospherereaches clients on a dedicated server. The server sends the active Y-bands over the optionalisekai_api:client_atmospherechannel on login,/reloadand dimension change; the client applies them before falling back to its own registry, so sky and fog match what the server loaded. Vanilla clients and clients without the channel are unaffected./isekai validate dimension <id>reports theLevelStemprofile (build height, sea level, default block, ceiling) and the silent failures:applies_tomatching no biome, aplayable_rangeoutside the build height, unresolved biome tags, features skipped in that dimension.- Start-point safety in
/isekai validate dimension <id>. For a dimension with a declared worldshape the report adds aspawn OK/WARN/ERROR/SKIPline: the first solid block below the start point (max 32 blocks) is the footing, the two blocks above it must be neither solid nor fluid, water is a warning, and lava, a buried start or no footing is an error. The start point is the overworld's shared spawn, or the (0,0)MOTION_BLOCKING_NO_LEAVESheightmap position for other dimensions. - Worldshapes can be narrowed to dimension types.
dimensionalso accepts{ "dimension": "<key>", "required_dimension_types": ["<type>", …] }; a level whosedimension_typeis not listed is left alone. This lets a selectable world type keep its worldshape out of vanilla worlds that share theminecraft:overworldkey. The string form and an empty list mean no restriction (the 2.x behaviour). Java:Scope(api/remap) onWorldshapeDescriptor. DimensionProfile(api/query) andIsekaiQuery.getDimensionProfile(ResourceKey<Level>)expose a dimension's vertical bounds, sea level, default block/fluid andDimensionTypeflags before aServerLevelexists.- Nether preset.
isekai_api:hooked_nether(min_y 0,height 128, sea level 32, netherrack/lava defaults, legacy random source) withisekai_api:hook/final_density_netherandisekai_api:vanilla_nether_surface. The separate hook id keeps overworld overrides ofhook/final_densityout of the nether. - Dimension-scoped sky colour.
client_atmosphere.sky_color(0xRRGGBB) replaces the biome sky colour while the descriptor is active, resolved per camera Y like the fog overrides. Only the sampled base colour changes: vanilla's day/night, rain/thunder and lightning-flash shading still apply. Carried byClientLevelSkyColorMixin, so it exists on the client only, and it applies to dimensions whoseeffectsisminecraft:overworld(the vanilla sky path). isekai_api:nonefoliage placer. A crown of nothing, so aminecraft:treefeature can place a bare trunk without leaves.radiusandoffsetare optional and default to0, which makes{"type": "isekai_api:none"}valid on its own.- Six tree decorators.
minecraft:tree'sdecoratorsarray now acceptsisekai_api:parts:attach_to_logs(blocks on trunk sides),ground_patch(a disc of blocks around the base,coverorreplace),hang_from_leaves(strands from the crown's underside),snow_cap(snow layers on sky-facing leaves),branch_stubs(bare limbs out of the trunk, eachaxisfollowing the step, block optional so it can reuse the trunk's own block) andbroken_top(snaps the topcounttrunk blocks off, keeping at least one; optionalfill_providerturns the break into basalt or charcoal instead of air). Every block is ablock_providerslot, so the parts carry no species; leaf states written by a decorator are pinned ondistanceso they do not decay. Fields and the charred-tree example are indocs/DATAPACK_REFERENCE.md. TreeGrowers(api/wood) builds theTreeGrowera sapling needs from configured feature keys — plain, mega, secondary and flower forms — with Isekai's own name convention, so a wood set does not have to hand-write the eight-argument constructor; a wood set hands the result toWoodSet.Builder#sapling.- Bare-tree fixture and coverage. The GameTests load a leafless, branch-bearing tree from disk
through the real configured-feature registry and assert the trunk, stubs, snap and ground ring,
alongside codec round-trips for the new placers and decorators. The fixture and its test wrapper
classes stay out of the jar (
data/isekai_api_test/**,gametest/**). /isekai validate <namespace>reports missing wood-set files. For every species the namespace declares withWoodSet, it checks the loot tables, block and item tags, recipes, language keys, blockstates, models and textures that the species' parts imply, and lists each gap by kind and subject. Members that are not visible from the current side (client-only resource packs on a dedicated server) are counted as "not visible here" instead of missing. This catches a missing texture before it shows up as the purple-black checker in game.- A one-species example under
examples/4_wood/.ExampleWoodModdeclares a full wood set (log, wood, stripped variants, planks, stairs, slab, fence, gate, door, trapdoor, pressure plate, button, signs, leaves, sapling, potted sapling, boats) and its datagen; the pack beside it holds the configured feature with anisekai_apidecorator. The class is compiled and the pack is loaded only on the GameTest server, and neither ships in the jar. WoodSet.Builder#flammable(boolean). A set declaredflammable(false)is left out of the fire odds map and its logs are data-generated into#logsinstead of#logs_that_burn, so neither the logs nor the planks spread fire or burn away;WoodSet#isFlammable()reports the setting. One part cannot be turned off: every block keeps vanilla'signited_by_lavaflag from the oak properties it copies, so lava still sets it alight.- The wood-set audit covers sign textures. A set with
signorhanging_signalso needstextures/entity/signs/<path>.png,textures/entity/signs/hanging/<path>.pngandtextures/gui/hanging_signs/<path>.png, whichWoodSets.signTextureandWoodSets.hangingSignGuiTexturename. The example pack ships the three files. isekai_api:pooltakes ashore_width.shore_width(int 0–6, default 0) grows the pool's rim block outward that many more rings, so a pond can have a beach instead of a one-block lip. The rings are grown from the shell by adjacency, so the bank follows the basin's real outline, and only solid cells are replaced (below the waterline always, above it half the time — the same rule the shell uses). It does not change containment: a pool still refuses terrain that cannot hold it.0is the old single ring, and the default, so existing datapacks place the same blocks.isekai_api:leaningtrunk placer takesslant_curve,space_checkandmin_height.slant_curve(double 1.0–2.0, default 1.0) lengthens each successive sideways step, so the samelean_lengthcovers more ground and the bend accelerates instead of forming an L; 1.0 is one block per step and byte-identical to the old tree.space_check(bool, default true) ends the lean at an occupied cell and keeps the crown on the trunk — see Fixed.min_height(int 1–16, default 4) makes the tree place nothing when its trunk would be shorter, which is what a deliberately short palm needs. A datapack that omits all three gets the old shape.isekai_api:leaf_distancesstructure processor. Recomputes a pasted template's leaf decay data from the template's own#minecraft:logsblocks: distance 1 for a leaf touching a log, +1 per leaf step, 7 when no log is reachable.orphan_leaves(decay|persist, defaultdecay) decides whether unreachable leaves are left to decay or marked persistent, andkeep_persistent(default false) decides whether a template leaf's existing persistent flag survives. It runs infinalizeProcessing, so it sees the states earlier processors produced. A template saved with every leaf at distance 7 no longer sheds its whole crown on the first shape update.isekai_api:grounded_templatetakes aprocessorslist. The same field a jigsawsingle_pool_elementhas: a processor-list id or the list written inline, applied when the piece pastes the template. Omitting it places the NBT exactly as saved, which is what every existing datapack already got. Attachingisekai_api:leaf_distanceshere fixes a hand-authored tree without routing it through a jigsaw pool.isekai_api:grounded_templatevaries the shape.rotation(noneby default, plusclockwise_90,clockwise_180,counterclockwise_90,random) andmirror(noneby default, plusleft_right,front_back,random) turn or flip the pasted template, andtemplatenow also takes a weighted list, so one structure entry can share several NBT variants.randomdraws once per placement attempt from the chunk's structure seed. The gates sample the rotated extents, so a quarter-turned template is judged on the ground it actually covers, and the template stays centred on the chunk middle in every orientation. A datapack that omits the new fields places the same blocks as before./isekai survey <structure> [radius]replays structure placement over a square of chunks and reports how many chunks the structure set offered, how many were placed, and, for the rest, which gate rejected them (clearance_above_fluid,max_slope,biome, ordeclinedfor a structure type with its own reason). Nothing is generated to disk and no chunk is loaded, so it answers "why does this never spawn" on a live world; the same numbers are written to<world>/isekai/survey/<ns>_<path>-r<radius>.json. The rejection attribution runs throughStructureProbe, which is inert outside a survey./isekai fit <structure> [pos]shows one chunk at full detail: theWORLD_SURFACE_WGheights the gates read as a 3x3 grid, the minimum/spread againstclearance_above_fluidandmax_slope, the verdict, and wherevertical_offsetputs each template variant. It also flags the two authoring mistakes that make a structure vanish without an error: atemplateid with no NBT (reported as0x0x0) and a chunk no structure set offers. Written to<world>/isekai/fit/<ns>_<path>-<chunkX>_<chunkZ>.json./isekai survey blocks <block|#tag> [radius] [center <x y z>] [biome <biome|#tag>]counts what actually made it into each chunk: it generates the square (default radius 8, max 32) toFEATURES, spread over ticks, and reports trees, matching blocks, mean/median/min/max, the share of empty chunks, how much of the total sits in the busiest 10% of chunks, and a histogram. One tree is one six-connected group of matching blocks inside a chunk, so a 2x2 trunk counts once and a leaning trunk counts once. The optional biome filter is answered from the seed, so skipped chunks are never generated. The per-chunk map and the same summary are written to<world>/isekai/survey/blocks-<target>-r<radius>.json. This one does generate terrain to disk.isekai_api:curvedtrunk andisekai_api:frondcrown. A palm that bends while it climbs instead of rising straight and then walking sideways: each level adds one log on the lean side with a chance that grows with height (bend), the bent logs take the lean axis, and a single crown site sits on the top log.frondgrows eight arched, drooping fronds (the diagonals as face-connected staircases) sampled per frond, so the top view is eight-pointed rather than a cross.leaningandfanare unchanged.fluid_edgecan search a band of heights. The optionalvertical_range({"below": n, "above": n}, both 0–64, default 0) widens the fluid search from the input Y toY-below … Y+above. One modifier now expresses "no water within 12 blocks anywhere from sea level to 18 above it", which used to take a chain of one modifier plus one Y anchor per level. Omitting the field reads the input Y only, so existing packs behave exactly as before; the widened path also stops each column at itsMOTION_BLOCKINGheight, so open sea costs one lookup per column instead of one per level.isekai_api:biome_falloffplaces a feature with a probability that falls off with distance from a biome.P(d) = t^exponentwitht = (max_distance - d) / (max_distance - full_distance): full density insidefull_distance, zero pastmax_distance, thinning smoothly in between, so a biome border reads as fading density instead of a line.full_distance = max_distancegives a hard radius — whatspatial_predicate'snear_biomecannot do at placement time, where it always passes. Distance is never measured: one draw becomes a search radius and the rings of biome cells are walked until the first hit, so a position next to the biome costs a few samples (worst case atstep4, no biome in range: 197 / 797 / 3,209 samples for a 32 / 64 / 128-block radius).vertical_rangecovers dimensions whose biome changes with altitude. Biome cells are remembered per thread for the rest of the chunk's candidates, so the worst case above (76,741 samples, 29 ms per chunk in the nether at a 64-block radius) costs 0.9 ms.isekai_api:overridewraps another biome source and replaces the biome inside zone footprints. Everything no zone claims is answered bybase, so the base's own rules, seed and climate sampling keep working — a jungle island or a single-biome region inside otherwise vanilla terrain without giving up the vanilla source. Zones are evaluated in declaration order and the first match wins. Two new zones come with it:isekai_api:box(an inclusive block-space X/Z box with optionalmin_y/max_y) andisekai_api:chunk_box(an inclusive chunk-aligned box, full height). An override changes the surface biome — surface blocks, vegetation, structure and feature eligibility, spawns, sky and fog colour — not the terrain shape, which the base generator's climate noise still decides; a patch over an ocean stays ocean-shaped. Newly generated chunks only.base_biomeandclimatezones read the world, not just the coordinate.isekai_api:base_biome(biome: an id, a list, or a#tag) matches where the wrapped source's own answer is one of those biomes, so anoverridepatch follows the base's borders instead of a drawn box — every soul sand valley becomes crimson forest in the nether, or forest below Y 80 in the overworld.isekai_api:climatematches the vanilla climate sample on any of the six axes (at least one is required), so oneclimate_zonesrule can now be used anywhere a zone goes,overrideincluded, where the replacement biome and the climate that keeps deciding terrain stay independent. The source fills both values once per position and shares them across zones, so a stack of climate conditions costs one sample;base_biomeis only meaningful underoverrideand answers false underrule, which has no wrapped source to ask. Java:BiomeZone.test(x, y, z, ZoneContext)is a new overload andZoneContext(NONE,forClimate) carries the state; the three-argument method, its default and existing third-party zones are unchanged. Measured over 200,000 positions (ns pergetNoiseBiome, median of three runs): wrapping the nether costs nothing (122 → 122), and 15and(base_biome, noise_threshold)children cost 327 — written noise-first the same 15 cost 923, sobase_biomegoes first./isekai survey biomes <radius> [center <x y z>] [y <y>]measures a seed's biome map without generating it. It samples every 4-block column of a disc through the biome source, so the biome shares are exact counts, and groups face-connected cells of one biome into patches whose area is reported as the diameter of a circle with that area (2*sqrt(area_blocks/pi), so a radius-64 patch reads as 128); patches that touch the rim are counted and excluded from the median and p90, with the excluded count reported. The same scan reports the six vanilla climate axes unquantized as p1…p99, labelled with both the JSON name and the F3 name (humidity/vegetation,weirdness/ridges). Nothing is generated and no chunk is loaded, so the scan runs on a worker thread while the server ticks; onebiomessurvey runs per server at a time, and a radius is required (16–4096 blocks, defaulting to the executor's position and Y). Writes<world>/isekai/survey/biomes-<dimension>-r<radius>-<x>_<y>_<z>.json; radius 2048 is 823,592 cells and takes about 0.3 s measured in a GameTest server.
Fixed
isekai_api:assembledputs its origin on the ground, not on a tree crown. The origin's Y came straight fromWORLD_SURFACE_WG, which counts leaves and logs, so a neighbouring tree whose crown covered the origin column lifted the whole feature list onto the canopy: a pool dug into open air (and its containment check refused it) and a pad spread its sand at tree height. The Y now walks down past air,#minecraft:leaves,#minecraft:logsand replaceable plants to the first block that is terrain, and stops on fluids, so an over-water structure keeps its water-surface origin.isekai_api:assembledplaces its features once, not once per overlapping chunk. A piece'spostProcessruns for every chunk its box overlaps, each with its own random, so a three-chunk-wide assembled landmark could re-place the whole feature list up to nine times and stack nine differently-shaped pools and tree clusters on one spot. The run is now gated on the chunk that contains the origin, which does not depend on chunk visit order. Features may still write past that chunk, exactly as aplacefeature does during decoration.- A
leaningtrunk no longer attaches its crown to a blocked cell. Withspace_checkon (the new default), a lean that runs into an occupied cell stops there and the crown stays on the trunk; previously the crown could sit in mid-air where no log could be placed. Setspace_check: falseto reproduce the old shape. - Worldshapes for different dimension types of one dimension key coexist. Single-layer
declarations were stored one-per-dimension key, so a Sky World shape (
sky_world:sky) and a Tundra World shape (frozen_world:frozen) both targetingminecraft:overworldreplaced each other in load order and one world type got no shape at all. Declarations are now grouped byScope;getActiveDescriptorpicks the one whoserequired_dimension_typescontains the level's actualdimension_type(restricted over unrestricted, then higherpriority). Same- scope declarations keep the old priority rule. If the type is unknown and two restricted declarations exist, the registry returns none rather than guessing. - Worldshape bounds resolve per dimension. Ore/feature Y-remapping and the
playable_rangeenvelope used the overworld'smin_y/heightfor every dimension. They now come from the dimension'sLevelStem/DimensionType, keyed by the descriptor'sdimension. Only a level with noLevelStementry falls back to the overworld envelope. - No declarations, no cost. Every hook returns on an empty check before a registry or biome lookup; the reconcile returns immediately when no worldshape is declared.
- Decorators no longer inherit a 2x2 trunk's ground blocks.
TreeDecorator.Context#logs()carries one block per trunk column written byTrunkPlacer.setDirtAt(four forgiant_trunk_placeron grass), and only the first was dropped.branch_stubswithout ablock_providercould therefore take its block from dirt and start one row too low. Every dirt-like entry at the lowest level is now dropped, and only when a trunk block sits above it. - The wood-set audit reads references the way the game does. A bare path in a model
parent, atexturesvalue or a blockstatemodelresolves tominecraft:, not to the namespace of the file that names it; a value that is not a valid resource location becomes areferencefinding instead of failing the whole audit./isekai validate <namespace>prints the validation result before the wood-set audit, and an audit failure is logged and reported as one line instead of hiding it. broken_top'sfill_provideruses the decorator placement helpers. A leaf used as the fill is pinned like every other decorator-written leaf rather than written atdistance: 7.- A wood set's builder is claimed only after registration succeeds. A failure part-way through
register()no longer leaves the builder marked as registered and unusable. WoodSetssurvives parallel mod construction. NeoForge constructs mods in parallel; the set list and the boat lookup are now concurrent collections.- Docs: a pinned leaf is not a permanent leaf.
LeafPlacing, the placer section ofdocs/DATAPACK_REFERENCE.mdand the README now state that the pin carries a leaf through generation, and that the first tick recomputes the real distance, so a leaf more than six steps from a log decays as a vanilla leaf does. The behaviour is unchanged. - Docs:
ground_patch's radius limit has a stated reason. 16 is the largest disc that stays inside the chunks a feature may write (ChunkStatus.FEATURESwrites one chunk out), while a placement modifier that moves the feature's origin into a neighbouring chunk can still reach past it. - A
leaningtrunk's horizontal walk is capped at 12 blocks.slant_curveis exponential, soslant_curve2.0 withlean_length16 walked 131,071 blocks sideways — far outside the chunks a feature is placed into, and the crown was attached there. The stalk now stops at 12 blocks of total horizontal travel from the origin (the near-vertical lean counts).slant_curve1.0 with alean_lengthof 13–16 is truncated at the same limit; every configuration that stayed inside 12 blocks (including 1.0 up to 12) generates exactly as before. - A
leaningtrunk withspace_checkon keeps its crown on the last log it placed. The fix for the blocked cell moved the crown but left the returned attachment pointing at the intended end position, so a decorator ortip_crown_onlyfan could still hang from a spot with no log under it. The last attachment is now the last placed log itself.space_check: falsekeeps the old geometry for packs that reproduce it deliberately. /isekai survey blocksno longer claims to stay under 8 ms. Chunk generation runs on the server thread inside the tick, so one chunk per tick means tens of milliseconds per chunk and TPS drops for the length of the run; the tick loop can only decide whether to start another chunk, not slice one. The docs and README now say so, and the per-chunk count is stated as a lower bound because a later chunk's tree can still write into a chunk already counted.- Only one
/isekai survey blocksruns per server. A second run inside the same window interleaved with the first inside the same ticks and counted the same chunks twice; it is now refused with a message naming the run that is still going. isekai_api:pool'sshore_widthis taken out ofxz_radius. A radius plus a shore larger than the 15 blocks a feature may reach was cut off at the chunk border, leaving a straight edge instead of a bank. The effective radius is nowxz_radiusshrunk byshore_width(floor 1), soxz_radius14 withshore_width6 reaches 15 rather than 19. Pools whose radius plus shore already fit are unchanged./isekai fitsays which variant it measured. The verdict describes one footprint — the first template variant, unrotated — but the report looked like it covered every variant, androtation: randomdraws a different turn per chunk. The summary now names the measured template and rotation, and the JSON carriesmeasured_template/measured_rotation./isekai validate dimensionno longer generates the chunk it inspects. A non-overworld dimension whose (0,0) chunk is not loaded reportsspawn SKIP(the column is not sampled) instead of reading the heightmap and blocks, both of which would load or generate that chunk. Stand at (0,0) or/forceload add 0 0to get a verdict.- A wall sign is audited under its own language key. The species audit built each block's key from
getDescriptionId(), and vanilla's wall sign returns the standing sign's name, so the wall key was never checked while the standing key was checked twice. A missing<ns>:<species>_wall_signname (and a wall hanging sign's) is now reported. - A pool lines around logs and leaves instead of burying them. The rim now uses vanilla
LakeFeature's rule and only overwrites cells that are solid and outsideminecraft:lava_pool_stone_cannot_replace, so a pool that reaches a tree banks around the trunk; a widenedshore_widthfollows the same rule. leaningwithspace_checkstops at a blocked cell in the vertical trunk. The trunk used to skip the log and keep climbing, leaving the crown on air and the stalk attached above the hole; the crown now goes on the last log that exists.- The Japanese name of a potted sapling follows vanilla's word order:
植えられた〈樹種〉の苗木forblock.<ns>.potted_<species>_sapling, as in植えられたオークの苗木. - A
frondcrown lifted byoffsetno longer hangs off the trunk. Leaf distance follows face contact, so lifting the crown above the top log left every frond reached only through a diagonal: the whole crown sat past the sixth step and decayed as soon as it was ticked, while untouched leaves kept their generation-time pin and hid it. The lift cells are now filled with leaves and the lift is spent from the same six-step budget as the fronds.
Changed
/isekai surveycapsradiusat 128 instead of 512. The scan is quadratic and runs inside the command call on the server thread: 512 was 1,050,625 chunks of placement tests plus a generation check for every candidate in one tick. 128 is 66,049 chunks; use several smaller runs instead.structure_spawn_overridesis scoped to the structure, not the dimension. It writes the structure's own spawn settings, so a descriptor that sets it also changes that structure in every other dimension. The datapack reference now says so in the scope table; the other override keys keep their dimension scope.- A nether or end on an
isekai_api:biome source no longer opens behind the experimental-settings prompt. Vanilla accepts only its stock biome source and noise settings there, so a mod that shipped an Isekai nether inside its own jar still asked players to confirm "experimental settings" when the world was created and first opened. Isekai API now reports such a dimension as stable when it keeps the stock dimension type key and aminecraft:noisegenerator; its own noise settings are allowed. Other causes keep the prompt: a non-Isekai source with its own noise settings, a swapped dimension type key, a dimension count other than three, and any worldgen registry entry (dimension_type,noise_settings, biomes, features) from a user datapack.
Known limitations
- Biome attributes are shared. Climate (
temperature,downfall, precipitation) and effects (colors, particles, sounds, music) cannot differ by dimension when a biome is shared; useapplies_toto limit which biomes a descriptor edits. atmosphere.mob_spawn_costsstays global, becauseNaturalSpawner#createStatehas no level.creature_generation_probabilityis written to the same shared biome.- Carvers are dimension-scoped only on
NoiseBasedChunkGenerator. A dimension with another generator, or aNoiseBasedChunkGeneratorsubclass that overridesapplyCarverswithout calling super, keeps the old biome-wide add/remove (CarverScope.hookable). - Mob exclusions do not reach a custom mob that calls
addFreshEntitywithoutfinalizeSpawn. Additions and weight changes only apply where a biome spawn list is read. /reloaddoes not change worldgen rules. NeoForge runs biome modifiers once at server start, so adding or removing a rule needs a restart.- A declared biome loses other mods' features in every other dimension. The reconcile removes the original holder, so a dimension that reuses the biome without declaring it no longer gets that feature.
- Structure dimension resolution during generation depends on the chunk being a
ChunkAccess. An implementation that passes only aLevelHeightAccessoris not in the index and falls back toBiomeSourcematching, which is ambiguous when two dimensions share one biome source (ChunkDimensionIndex,DimensionResolver). /place structureis not blocked byexclusions.structuresbecause it skips the generation-point search.- The final feature veto covers the
placeWithContextroute only. A generator that places a feature by another path can still place it; the decoration filter is the primary mechanism.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects