Repository navigation
Releases: MaxLananas/Hauteur
Release list
Hauteur v2.0.0
Renamed from SkyWindow to Hauteur, with a new package, groupId and configuration location, so this is a
major version. The earlier SkyWindow releases (1.1.1 to 1.3.0) are described on their GitHub release pages.
Changed
- The project is now Hauteur (formerly SkyWindow). It was briefly named Altus on this branch; the name was
dropped before any release because a NeoForge mod already uses the/altuscommand. Jar:hauteur-<version>.jar. Package:
io.github.maxlananas.hauteur. Extension id:hauteur. Command:/hauteur. - Maven
groupIdis nowio.github.maxlananas(it wasfr.buildtheearthin 1.0.0). The repository name is unchanged. - Migration:
extensions/skywindow/config.propertiesis copied toextensions/hauteur/on first start (the old file
is kept)./skywindow,/swand/bhoremain as command aliases. - Licensed under the MIT License (see
LICENSE). - GitHub Actions are pinned to commit SHAs, with the tag in a comment. The workflows run with read-only
permissions by default; only the publish job can write to releases. - CI, release and the README use the Maven Wrapper (
./mvnw, Maven 3.9.11, Apacheonly-mvnwscript). The
distribution is not yet pinned by checksum; see.mvn/wrapper/maven-wrapper.properties. - Test results are published as check-run annotations: one totals line and one error per failing test. They stay
readable when the job log is not. - The pipeline no longer depends on Geyser session types. It reads the session, settings and logger through
small interfaces (PlayerSession,PipelineSettings,Diagnostics) with Geyser adapters. This is internal. - The per-player transition state (window offset, freeze flags and epoch, anchor) is private to
HauteurSessionand
read and written through accessors. This is internal. - The
/hauteur statscounters are addressed by one enum (HauteurSession.Stat). A reset captures every counter
by construction, so a new counter cannot be left out of the reset. - Release jars are reproducible for a given tag: entry timestamps are taken from the tagged commit. A release built
against a Geyser SNAPSHOT is flagged in the workflow log, because the snapshot can change under it.
Fixed
-
/hauteur window <Y>now respects the switch cooldown and its backoff. Before, a player could repeat it as soon as
each freeze ended, and every switch resends the whole chunk cache to that client. -
/hauteur window <Y>only accepts a height within 4 blocks of the player's current height. Before, the snap moved the
client to any height in the world, so any player could teleport vertically with the command. -
A window switch deferred to the event loop now re-reads the newest position and goes through the cooldown check
again, instead of switching on the position captured when it was requested. -
DEGRADEDstatus is now reported:/hauteur infoanddoctorshow it when the pipeline never attached (after
the retry budget, or when Geyser is not running). The flag was read but never set. -
Race in the dropped-destroy re-check list: the duplicate test, the size test and the add were separate steps
across two threads, so the list could exceed its limit of 256 (measured: 257 entries in a contended run). They
now happen under one lock inHauteurSession.recordGhostRevert. -
Real Y below the client floor (
javaMinY < clientMinY) is now reported once per session at join, instead of
being silently unreachable. -
A dropped destroy was recorded for the re-check after a switch only for the first eight distinct positions of
that freeze. Later ones were not re-checked, so the client could keep showing a block the server still has, and
nothing counted them.
The limit is now 256 positions (about 16 KB, estimated), and anything beyond it is counted (GHOST_OVERFLOWS). -
With a switch margin of half the window height minus 8 or more (for example 128 on a 256-high window), the window
re-homed at almost every section boundary: about 55 switches per 1000 blocks walked, with one-block reversals,
each one a frozen input and a chunk replay. The margin is now capped at half the window height minus 16. The
default (64) is unchanged. Measured by simulating the policy; not reproduced on a live client. -
A flying or falling player could stay outside the height window for seconds. The switch cooldown, which doubles after
quick switches (up to eight times the cooldown), also delayed a switch that the client needed to see the world. A
switch is now never delayed while the client is outside its window. Simulated with the real window rule: at 40 blocks
per second in a 256-high window, the client was outside for about 34 of 120 seconds before the change and none
after, for about 3 seconds more freeze over the same time. Not measured on a live client. -
A player action that names no block (releasing the held item, swapping hands, stab, and a drop from the inventory)
was shifted by the window offset and, during a switch, held and resolved as a block action. Geyser sends these with a
zero position, which is not a block, so the action was dropped when neither frame was plausible. The consequence (a
released bow or food left in use on the server) follows from the code and was not reproduced on a live server.
These are now sent unchanged and never held. Digging, and a drop taken from the block-break action (which carries the
client's block position), still name a block and are shifted and held as before. -
The chunk cache evicted the oldest chunks to fit its budget without any record. Those chunks were then missing after a
window switch, with no counter to explain it. Budget evictions are now counted (CHUNK_EVICTED_BUDGET, shown by
/hauteur stats), and the README states the eviction rule. -
rewrite-commands=/tpkept the slash, never matched a chat message, and silently disabled the rewrite. A leading
slash is now accepted, and an entry that is not a plain command name is reported and ignored. -
Window targets for very large heights (above about 2e9 blocks) overflowed an int product and went to offset 0, while
larger values went to the maximum. The snap is now computed and clamped in double precision; non-finite heights give 0. -
Player names: a stacked combining-mark name ("zalgo") is capped at three marks per base character, so it cannot bloat a
log line. The zero-width joiner stays allowed, as documented. -
Standalone Geyser without Erosion: direct world reads (collision correction, swimming and climbing checks) were shifted
by the offset a second time, because Geyser reads its own window-space chunk cache there. This comes from reading
Geyser's source and was not reproduced live. The wrapper now shifts only the reads that reach the real world, with
Geyser's own rule. -
With an Erosion backend, async lookups fell back to the synchronous read, and each batch read sent one request per
block. Both now reach the delegate's async and batch methods, with the offset applied. -
Failures that were swallowed silently are now logged: the session sweeper (each run and its scheduling), restoring
the platform world manager, and re-reading a block to revert a dropped destroy. Each used to leave a stale state with no trace. -
The held-write queue could exceed its limit under concurrent writes: producers checked the size, then added, so
several could pass the check together. A slot is now reserved first, and the limit is exact (a test with eight
racing producers shows 101 accepted entries against the old code, 100 against the new one). -
Damage events carry an absolute source position. It was sent unshifted, so the hit direction pointed one window
offset away from the real source. It is now shifted like the explosion centre; an absent position is left as it is. -
/hauteur windowacceptedNaN, infinite and out-of-dimension values, and the handler could anchor on a non-finite
Y. Such a value could snap the client outside the world on detach. Both now refuse it, and a non-finite client Y
drops the packet without moving the anchor. -
/hauteur stats resetdid not reset the freeze-time total, so the average freeze after a reset mixed two periods. -
Packets held during a window switch were written but never flushed. They could wait in Netty's outbound
buffer until the next packet from Geyser, which may never come if the player stops moving. The freeze now ends
with a flush. -
Disabling or reloading the extension while a player was shifted left the client in the shifted frame, and its
next movement reached the server at the wrong height. The client now gets its real-space view back (cached chunks
replayed at offset 0, snap to the real Y) before the pipeline is removed. -
A reload after an earlier enable could leave a world-manager wrapper that disable never restored. The original
manager is now adopted from the existing wrapper and restored on disable. -
A failed dimension read replaced the window with "not needed", switching windowing off while a player was
shifted. The previous snapshot is kept instead. -
Shutdown now cancels the session sweeper; its scheduled task used to outlive the extension.
-
Player names in logs go through one sanitizer: control characters are replaced, names are cut to 32 characters
without splitting a surrogate pair. -
Window switches replayed the chunk as it arrived and reverted later block and block-entity edits. Each cached
chunk now keeps a journal of those changes and replays it. -
The chunk-cache budget was not strict: a 32-chunk exemption let it be exceeded, and light arrays were not
counted. The budget is now strict, and an oversized chunk is not cached. -
Own-player teleports (
ClientboundPlayerPositionPacket) were not translated, so a teleport to altitude reached
the Bedrock client at the real Y. They are now translated, and they trigger the window switch. -
Relative Y values in teleport packets were shifted as if absolute.
-
Dur...
SkyWindow v1.3.0
SkyWindow 1.3.0 - windowed height support for Bedrock players on Minecraft 1.21.x.
Highlights:
- Universal command oracle on Mojang Brigadier (vendored MIT sources): every command of every plugin rewrites with zero configuration - literal-exact matching, argument fallback with backtracking, redirect aliases,
execute ... runrecursion. Existing commands are never modified; the plugin adapts to them. - Full text-carrier packet coverage: brushable blocks, decorated pots, structure blocks, trial spawners, bells, lecterns, signs (front/back/all) - enforced by a package audit that breaks the build on any unhandled position/text packet.
- All in-game commands removed: the whole
/skywindowfamily is gone - the extension is fully invisible and zero-config. Contributor: MaxLananas. - Deterministic seeded fuzz suites (rewriter, chunk re-slicer) and the full 1.2.x guarantee set kept: single rewrite line Y=0..511 <-> 1440..1952, see/use/place/destroy through Y=1952.
Verify with: sha256sum -c SHA256SUMS.txt - see CHANGELOG.md for the full list.
SkyWindow v1.2.1
Geyser extension: windowed height support for Bedrock players (see README for guarantees and limits). Verify with: sha256sum -c SHA256SUMS.txt
SkyWindow v1.2.0
Geyser extension: windowed height support for Bedrock players (see README for guarantees and limits). Verify with: sha256sum -c SHA256SUMS.txt
SkyWindow v1.1.1
Geyser extension: windowed height support for Bedrock players (see README for guarantees and limits). Verify with: sha256sum -c SHA256SUMS.txt