Repository navigation
Releases: UpperMoon0/Endless
Release list
Endless v0.10.1
Endless 0.10.1
- Capture immutable sparse block palettes in a bounded camera vicinity once per vanilla render chunk on Minecraft 1.20.1 and 1.21.1, avoiding synchronized world lookups for each meshing block read. Preserve live block-entity discovery, distant-query fallback and normal rebuild invalidation.
- Add a production-client FPS comparison against vanilla, Fabric alone, and Endless 0.10, with frame-time tails, native framebuffer checks, and local-only raw results.
What's Changed
- Fix per-workload benchmark execution validation by @UpperMoon0 in #29
- perf: optimize sparse client meshing and benchmark FPS (0.10.1) by @UpperMoon0 in #28
Full Changelog: v0.10...v0.10.1
Endless v0.10
Endless 0.10
- Index sparse height-cache results by horizontal chunk and local column. Block changes invalidate only that column's height types instead of scanning the world's cached heights.
- Reuse per-engine block/sky light adapters while preserving delegate changes and inactive-world behavior.
- Check the bounded dense core before the logical sparse range on ordinary terrain reads.
- Add cached-empty-column, neighboring-column, all-height-type, lifecycle and native lighting regressions.
- Add a reproducible dedicated-server benchmark against official vanilla, Fabric without Endless, and the previous Endless revision. Client FPS and populated multiplayer remain separate performance scopes.
What's Changed
- perf: reduce height-cache and lighting overhead (0.10) by @UpperMoon0 in #27
Full Changelog: v0.9.4...v0.10
Endless v0.9.4
Endless 0.9.4
- Fix the Forge 1.20.1 startup VerifyError caused by destruction-rendering temporary locals overwriting Oculus callbacks. Preserve exact high-Y crack positions and vanilla behavior when logical heights are inactive.
- Bundle the Forge MixinExtras runtime needed by the shared rendering hook, including installations without Oculus or Create.
- Add JVM verification and destruction-hook regressions, and run the native renderer smoke suite with Oculus 1.7.0 as well as 1.8.0.
What's Changed
- Fix Oculus startup VerifyError in destruction rendering by @UpperMoon0 in #26
Full Changelog: v0.9.3...v0.9.4
Endless v0.9.3
Endless 0.9.3
- Fix vanilla void fog turning extended space below the dense chunk floor black. Active sparse worlds now use their configured logical floor for void darkening.
- Apply the fix to Minecraft 1.20.1 (Fabric/Forge), 1.21.1 (Fabric/NeoForge), and 26.1.2 (NeoForge), including air and water in every biome.
- Keep vanilla fog colors, fade distances, fluid-specific behavior and status effects; inactive worlds, including legacy controls, keep their native floor.
- Add regressions for deep space, the logical lower boundary, vanilla-range and legacy controls, and narrowed configured ranges. Dense storage and terrain generation remain unchanged.
Performance:
- Reuse bounded section block-light layers instead of repeating a per-block search. Copy palettes under short storage locks, solve outside those locks, and invalidate dense/sparse lighting on writes and section changes.
- Reuse immutable page snapshots within a 16 MiB / 256-entry budget.
- Add authoritative bulk generated-page admission without the snapshot encode/decode round trip; existing saved pages are refused.
- Queue initial page delivery fairly with per-tick/per-player limits, and spread periodic sparse writes across ticks. Explicit saves and shutdown still flush all dirty data.
- Add concurrency, eviction, fairness and native cross-section/dense-seam lighting regressions.
- Solve skylight snapshots outside sparse storage locks too: dense halo admission can otherwise deadlock with lighting invalidation. Add native unloaded-halo regression coverage.
Generation and synchronization:
- Validate natural-spawn positions against the logical lower floor on all five targets without changing native mob caps or allocating dense height. Habitat sampling remains the terrain mod's responsibility.
- Add independent uniform native section construction for Minecraft 1.20.1/1.21.1, including matching block/fluid counters and mutation isolation. The API is not provided on 26.1.2.
- Cancel obsolete page windows, discover loaded chunks incrementally without synchronous disk preflight, and retain exact page/notification cursors when the bounded queue is full. Stationary distance-4/8/12 saturation regressions cover eventual delivery.
- Scope in-flight light invalidation to affected section keys so unrelated edits do not restart a solve.
- Add soft byte/time targets alongside page counts: 4 MiB / 4 ms for sends and 4 MiB / 2 ms per periodic world flush. One indivisible page can exceed these targets; explicit save/unload/shutdown remains synchronous.
Included since the last published version (0.9.1):
- Include the unreleased 0.9.2 Forge 1.20.1 / Embeddium Create elevator-rope rendering fix, lifecycle-safe global-renderer tracking, and updated showcase artwork. See changelogs/v0.9.2.txt for its precise scope.
Validation limits:
- Existing native teleport, populated multiplayer/dirty-page latency and cross-mod performance measurements remain workload-specific follow-up work. Historical combined Tidal Terror client tick-p95 and worst-frame regressions are not erased by improved frame p95 or separate generation measurements. This release makes no blanket engine-wide performance claim.
What's Changed
- Fix Create elevator rope rendering and refresh showcase imagery by @UpperMoon0 in #23
- Fix logical-floor fog and optimize sparse lighting and page admission by @UpperMoon0 in #24
Full Changelog: v0.9.1...v0.9.3
Endless v0.9.1
Endless 0.9.1
- Expand optional renderer compatibility across all five existing release targets: Forge/Fabric 1.20.1, Fabric/NeoForge 1.21.1, and NeoForge 26.1.2.
- Add Fabric/NeoForge Embeddium and Sodium adapters, including sparse section snapshots, block entities, block/sky lighting, bounded camera windows, dense update batching, and snapshot halo invalidation.
- Support the Sodium release required by Iris and the current 1.21.1 Sodium API family.
- Preserve exact block-entity destruction keys on 26.1.2 and camera-relative deferred mesh-job heights in Sodium 0.9.
- Preserve real-world logical height checks when Iris starts Minecraft early, while keeping dense chunk arrays bounded.
- Use NeoForge frame events for renderer batching, including bootstrap-based Sodium, and preserve the renderer-free block-breaking path.
- Add isolated native framebuffer profiles, lighting/edit/rebase/lifecycle regressions, packaged-hook checks, and an expanded CI rendering matrix.
- Require the complete renderer hook set in every production target, including omitted-hook negative regressions; share 1.20.1/1.21.1 section lookup and Sodium lifecycle/cache policies across loaders.
- Retain page-edit notifications during a section's initial build across every renderer adapter and retry them after upload, preventing stale first meshes after reloads.
- Document exact upstream pins and shader availability limitations; no renderer or shader mod is bundled.
What's Changed
- Expand optional renderer support across all release targets by @UpperMoon0 in #22
Full Changelog: v0.9...v0.9.1
Endless v0.9
Embeddium / Oculus compatibility (Forge 1.20.1):
- Supply sparse terrain, block entities and light snapshots with bounded camera-following section registration.
- Preserve fractional camera movement for initial transparent mesh sorting and later re-sorts at extreme heights.
- Use exact destruction-position keys for block-entity mining overlays.
- Refresh visible skylight when distant sparse roof pages arrive or are removed.
- Add native rendering regressions and a packaged client-mixin/runtime-selector gate.
- Refresh sparse Embeddium skylight after dense-core block/light updates, and invalidate the snapshot halo above and below the render window.
- Batch overlapping dense skylight refreshes once per render frame, including shared Oculus passes; add repeated-edit and cached skylight value regressions.
What's Changed
- Fix Forge 1.20.1 Embeddium and Oculus expanded-height rendering by @UpperMoon0 in #20
- Release Endless 0.9 with Embeddium/Oculus changelog by @UpperMoon0 in #21
Full Changelog: v0.8...v0.9
Endless v0.8
Create expanded-height compatibility:
- Use logical build limits for mechanical-arm client points and rope pulleys.
- Discover elevator contacts in allocated sparse pages, including persisted/evicted pages.
- Preserve exact contraption local positions in disk and spawn NBT; retain native legacy readers.
- Require new real Create machine/network and client-selection gates at dense, page and packed-Y boundaries.
- Bump the supported Create loader handshake protocols to reject older clients without the exact contraption reader.
- Preserve train graph packet heights beyond the signed-short range, including pixel offsets and dimension/framing data.
- Keep chorus-potato teleport destinations in the logical build envelope; preserve native landing/collision behavior with bounded allocated-page floor discovery.
- Persist exact assembly-error highlight positions while retaining legacy NBT readers.
- Keep mining cracks and Create multi-position cracks separate at packed-Y aliases; clean them up on update, retarget, removal and world replacement.
- Require restored moving entities, mounted inventories, drill actors and controller linkage across a fresh server JVM.
- Require native client selection packets, normal-tick arm inventory transfers and ejector delivery in survival mode at packed aliases.
- Invalidate Minecraft 1.21.1 navigation classification caches on sparse writes, including mutations before the dense chunk starts ticking.
What's Changed
- compat: support Create at sparse high Y (v0.7) by @UpperMoon0 in #17
- Fix Create expanded-height compatibility and require native gameplay coverage by @UpperMoon0 in #18
Full Changelog: v0.6...v0.8
Endless v0.6
Endless 0.6
- Added Minecraft 1.21.1 support on Fabric and NeoForge and Minecraft 26.1.2 support on NeoForge while retaining the 1.20.1 Fabric/Forge line.
- Consolidated duplicated per-version implementation sources into shared 1.20.1/1.21.1, modern-renderer, and version-neutral source sets to reduce port drift.
- Added release packaging and metadata validation for every supported Minecraft/loader target, including version-specific unit-test coverage and exact-head CI checkout.
- Fixed NeoForge 26.1.2 high-Y rendering so the visibility Octree uses the exact moving ViewArea vertical window, including the full 32-section window while its 8-section rebase hysteresis is active.
- Added a live render-window regression at render distance 12 that verifies both ViewArea edges remain inside the visibility tree before and during the hysteresis hold.
- Fixed high-Y block entities such as chests remaining invisible after save/rejoin until player interaction or a neighboring block update. Sparse page synchronization now sends a fallback block-entity data packet after the authoritative sparse page when vanilla provides no custom update packet.
- Added same-JVM save/reopen coverage for chest, ender chest, and shulker-box block entities on NeoForge 26.1.2 and strengthened render assertions to use exact XYZ coordinates.
- Added config-gated high-Y block-entity/render diagnostics.
debugdefaults tofalse; when enabled, detailedENDLESS_DEBUGtraces are also written tologs/endless-debug.log. - Fixed sparse block-entity render refresh ordering so delayed block entities are discovered and their render sections are rebuilt without relying on interaction.
- Kept the v0.5 sparse logical build envelope and fail-closed world-migration guarantees unchanged: supported configured Y remains -8,000,000 through 7,999,999.
What's Changed
- Port Endless to Fabric/NeoForge 1.21.1 and NeoForge 26.1.2 by @UpperMoon0 in #3
Full Changelog: v0.5...v0.6
Endless v0.5
Endless 0.5
- Added a configurable sparse logical build envelope from Y=-8,000,000 through Y=7,999,999.
- Made
config/endless.jsonauthoritative for placement, vanilla commands, teleport validity, AI limits and sparse runtime bounds; the ±8M representation ceiling is no longer treated as automatically buildable. - Preserved valid million-scale configuration values across launch instead of clamping them to the old ±2032 dense envelope.
- Kept fresh v0.5 worlds on a vanilla
[-64,320)dense chunk core regardless of logical range, so widening the config does not widenLevelChunkSection[]. - Preserved wider historical dense cores for upgraded worlds only when required for legacy Anvil safety; that internal range never widens the current configured build limit.
- Fixed same-JVM high-Y save/rejoin corruption so legacy/wide dense chunks and normal generated terrain remain intact when sparse million-height data is saved, the world is closed, and the same save is reopened.
- Added dedicated compressed-NBT sparse page persistence outside vanilla Anvil section serialization.
- Added an extended BlockPos network encoding for high-Y positions while preserving vanilla encoding in the normal range.
- Added high-Y block, fluid and block-entity access through normal Level/LevelChunk APIs.
- Added sparse heightmap overlays for world-surface, ocean-floor and motion-blocking queries.
- Added sparse block/sky lighting that avoids vanilla packed-Y wrapping.
- Added sparse high-Y POI persistence and search without widening vanilla SectionStorage loops.
- Routed high-Y block updates around ChunkHolder's dense per-section batching.
- Preserved client block prediction above vanilla's packed BlockPos Y envelope.
- Kept SectionPos-keyed POI/tick addressing inside the signed 20-bit SectionPos Y representation envelope.
- Added a 512-block camera-following render/sync window with sparse page resync and unload eviction.
- Added server-authoritative logical + dense-height negotiation for Fabric and Forge clients.
- Added explicit Waystones 1.20.1 placement compatibility so its
Level#getHeight()ceiling follows the configured logical maximum. - Added real Waystones+Balm compatibility coverage for sparse high-Y placement, block entities, manager position/UUID state and client observation.
- Added real
/setblocklive coverage provingminandmax-1succeed whilemin-1andmaxare rejected on both loaders. - Split client-only loader bootstraps so dedicated servers never resolve client classes.
- Expanded the real-client sparse-edge scenario to cover block/fluid/block-entity/POI/light/height persistence, rendering and player travel on both Fabric and Forge.
- Retained v0.4 fail-closed legacy-world migration guarantees.
What's Changed
- feat: complete sparse infinite-height engine for v0.5 by @UpperMoon0 in #2
Full Changelog: v0.4...v0.5
Endless v0.4
Endless v0.4 — Engine trust fixes
This release fixes correctness bugs found in review and caps the supported
build range to what Minecraft 1.20.1 can safely represent.
Behavior changes:
- Build height is capped to vanilla's guarded packed BlockPos envelope:
min >= -2032, max <= 2032 (exclusive top, highest placeable Y = 2031).
Previously advertised ±2,097,152 was not representable — packed positions
and block-update packets silently wrapped beyond the 12-bit Y envelope. The
16-block guard band at each edge matches vanilla's DimensionType span and
keeps neighboring-position operations from wrapping to the opposite end. - Minecraft 1.20.1 chunk files store each section's absolute section Y as a
signed byte (-128..127, raw block coverage [-2048, 2048)). v0.4 never
reinterprets wrapped section coordinates during migration. - The build range is persisted per world in data/endless_build_heights.dat.
It is read before any level is created, so chunk deserialization uses the
world's layout. Once persisted, effective range = union(world, config):
widening expands the world; a narrower config cannot shrink the persisted
world range and make saved sections unreachable. - Played pre-v0.4 worlds now pass a fail-closed migration gate before any
ServerLevel/chunk is loaded. Because pre-v0.4 used one global endless.json,
the current raw config is only a migration candidate, not proof of a
particular world's historical layout. The exact pre-clamp config is
preserved until classification completes, then all dimension region files
are inspected before the candidate is accepted. - Saved normal section payloads or block entities outside the candidate range
prove that a played world had a wider historical section array and stop
migration, even when the saved section's block palette is air-only. Saved
heightmap packing is also checked against the raw legacy span; for example a
64-long 1.20.1 heightmap paired with a current narrow config is conflicting
history and fails closed instead of being rebuilt under a guessed range. - Raw edge ranges such as [-2048, 2048) may clamp away section Y=-128/Y=127
only when those guard sections are provably air-only and contain no block
entity. Non-air blocks, malformed edge data, unreadable region data, ranges
outside the signed-byte section-Y envelope, spans over 4096 blocks, or an
untrusted legacy config stop startup instead of risking silent section loss.
World range metadata is created only after migration succeeds. - Existing but unreadable/invalid v0.4 world-range metadata also fails closed
rather than being treated as missing and replaced from the current config. - Multiplayer servers are authoritative during the login phase, before
ClientboundLoginPacket constructs the client world and before any chunk data
can arrive. Fabric uses a login query held open until the client applies the
range; Forge uses a login packet plus protocol/version gating. - Every new remote login now forces the vanilla baseline from the
ClientHandshakePacketListenerImpl constructor, not from ClientboundHelloPacket.
This covers offline-mode servers that skip the authentication hello entirely
and prevents an applied range from a failed previous login leaking into the
next connection. Integrated-server memory connections preserve the shared
server-authoritative range. - Chunk sections are real LevelChunkSection instances across the configured
range, matching vanilla invariants for saving, networking, lighting and mod
integrations. - Height values are normalized to 16-block section boundaries.
- Malformed configs use defaults in memory and are copied to
endless.json.broken when possible. Config normalization is deferred until
world migration has been classified; if the malformed-file backup cannot be
created, the original config is never overwritten automatically.
Fixes:
- Removed custom ChunkAccess section masks/helpers; vanilla highest-filled,
isYSpaceEmpty and findBlocks logic runs unchanged. - Restored vanilla lighting-storage lifecycle and copy-on-write semantics by
removing synthetic DataLayer overrides. - Left vanilla below-zero retrogen accessors untouched.
- Removed the duplicate Heightmap mixin; vanilla sizes heightmaps from the
effective chunk height and rebuilds incompatible persisted layouts only
after v0.4 has first verified that the saved packing agrees with migration
history. - Removed global SimpleBitStorage error suppression.
- Removed the old synchronous chunk-loading section cleanup and sparse/null
section machinery. - The client render grid is now a 32-section camera-following vertical window
with hysteresis instead of a fixed slab anchored at minBuildHeight. - Waystones compatibility reads the effective world/server-authoritative max
instead of the live file config. - Fabric and Forge both synchronize build height before client world creation;
failed/rejected logins cannot leave stale authoritative range state for the
next connection, including an offline-mode vanilla-server follow-up. - Release workflow checks changelog/tag collisions before builds/uploads,
validates exact loader artifacts, gates publishing behind tests/live joins,
and does not publish merely because a PR merged to master. - Development run tasks are loader-explicit (runFabricClient,
runForgeClient, runFabricServer, runForgeServer); ambiguous bare runClient /
runServer selectors fail with a clear message.
Developer / validation:
- PR Validate workflow compiles/tests the shared, Fabric and Forge projects.
- Unit regressions cover the guarded envelope, config overflow/preservation,
world-range merging, fail-closed legacy classification, changed-global-config
history (including saved Y=37 sections), 64-long heightmap disagreement,
raw-edge section handling, and storage. - Real-client live-join CI covers: extended server authority, an Endless server
with vanilla range against an extended client config, and a genuine Mojang
offline-mode vanilla server against an extended Endless client config, on
both loaders. The vanilla-server scenario deliberately pre-seeds applied=true
with an extended stale range before connection, so the every-connection
constructor reset is exercised instead of relying on a fresh JVM baseline.
Known limitations:
- True heights beyond the guarded packed-Y envelope require replacing position
serialization and are out of scope. - Vanilla clients cannot join an extended-range Endless server.
- Free-camera mods can move the camera independently of the player; the render
window may wait for the next vanilla-triggered update before following it. - Maximum-height memory/GC behavior is a separate performance validation item.
Empty vanilla sections use compact single-value palettes and lazy light data,
but 254 real section object graphs per chunk are still ~10.6x vanilla's 24;
fresh-world profiling at vanilla, 128-section and 254-section ranges remains
required before treating maximum-height OOM behavior as resolved.
What's Changed
- fix: cap range to packed Y envelope and restore vanilla section invariants (v0.4) by @UpperMoon0 in #1
New Contributors
- @UpperMoon0 made their first contribution in #1
Full Changelog: v0.3...v0.4