Skip to content

Releases: UpperMoon0/Endless

Endless v0.10.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:41
edbf417

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

Choose a tag to compare

@github-actions github-actions released this 14 Oct 02:53
d94d7b7

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

Choose a tag to compare

@github-actions github-actions released this 12 Oct 18:07
67b991e

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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 21:08
9279af6

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

Choose a tag to compare

@github-actions github-actions released this 06 Oct 10:53
f9cedc9

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

Choose a tag to compare

@github-actions github-actions released this 06 Oct 04:14
740f4ac

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

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:06
d79524e

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

Choose a tag to compare

@github-actions github-actions released this 26 Sep 04:16
00cce32

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. debug defaults to false; when enabled, detailed ENDLESS_DEBUG traces are also written to logs/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

Choose a tag to compare

@github-actions github-actions released this 16 Sep 11:22
782dab2

Endless 0.5

  • Added a configurable sparse logical build envelope from Y=-8,000,000 through Y=7,999,999.
  • Made config/endless.json authoritative 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 widen LevelChunkSection[].
  • 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 /setblock live coverage proving min and max-1 succeed while min-1 and max are 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

Choose a tag to compare

@github-actions github-actions released this 01 Sep 19:52

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

Full Changelog: v0.3...v0.4