Repository navigation
Conversation
The camera spectates an invisible client-only bat at the eye while the player rides a client-steered horse wearing the pack's cursor armour. A generated core/entity vertex shader recognises the armour, recovers the rotation from the head's top face, and draws the cursor with the include's mapping. The server hit-tests the player's rotation as in the unlocked mode. Closes #120
… cannot move it The shader reads a head corner's position as the horse's rotation, so any drift of the horse reads as a turn. A ridden horse still runs the client's fluid travel: floatInWaterWhileRidden lifts it 0.04 blocks a tick and currents push it, whatever its speed, jump strength, and gravity are. In a real 26.2 client the cursor vanished with water around the horse. A passenger is put back on its vehicle after each of its own ticks, and nothing moves an item display. The horse now rides one at its offset.
…rners Takes the head pivot and top face into shared constants and tests a Rust twin of the shader's recovery: against corner positions produced by the client's own armour model and render transforms, and across the whole canvas against the server's cursor mapping. The twin's single-precision error is under 0.0002 degrees, far inside the snap epsilon.
…w on instance change or respawn
…close it after a respawn finishes
…her instance Replace the delayed transition watch and deferred close callback. Death closes the window through the normal path, a spawn closes it only when the instance differs from the one it opened in, and opening on a dead or respawning player fails fast.
oglassdev
changed the base branch from
feat/fullscreen-session
to
feat/fullscreen-input
October 16, 2026 00:08
oglassdev
marked this pull request as ready for review
October 16, 2026 00:08
oglassdev
added this pull request to stack #130
October 16, 2026 00:26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #120
Part of #115
Adds horse mode, the locked full-screen view from #114 ("Horse cursor"), ported from the prototype.
How it works
MinestomFullscreenHorsespawns two client-only entities. The first is an invisible bat at the eye, which the camera spectates. The second is an invisible, tamed, saddled horse with no AI, speed 0 and jump 0, which the player rides. The horse wears copper horse armour whose equippable asset is the pack'sfullscreen/horse_cursor. On close: the camera returns to the player, the player dismounts, and both entities are destroyed.core/entity.vsh(vanilla 26.2 plus one branch), an equipment asset, and an armour texture: the signature texel at (0, 0), then the built-in cursor. Equipment layers (NO_OVERLAYwithPER_FACE_LIGHTING) whose texel (0, 0) matches the signature recover yaw and pitch from the head-top corners. They draw that face as the cursor with the include'swindow_fs_cursor_at, at the cursor layer's depth, and hide every other vertex.window_fs_ndcandwindow_fs_depthare shared withtext.vshthrough one Rust snippet, andtext.vshstays byte-identical.fullscreen::horseholds the offset, signature and asset. The manifest/KotlinFullscreenCanvasEntrygains an optionalhorseentry (offset, armour asset id), present only when a horse window exists.FullscreenDefinition.cursorisnullin horse mode, so no text cursor run is sent.Design choices
AbstractHorse.getRiddenRotation, checked in 26.2 bytecode). The shader doubles the recovered pitch and calls the samewindow_fs_cursor_atas the text shader. The server maps the player's own rotation packets withFullscreenMapping, as in the unlocked mode. Hover stays server-driven: outlines are re-sent when the hovered control changes.Files touched outside the new ones
MinestomFullscreen.kt(create the horse, lock it on the fake-survival tick, unlock it on restore, skip the heart clamp),FullscreenSession.kt(removed the horse check),FullscreenDefinition.kt(cursor isnullin horse mode),FullscreenHost.kt/FullscreenView.kt(docs),FullscreenEntries.kt(HorseEntry),hud/renderer/fullscreen.rs(extracted the placement snippet),hud/mod.rs(horse_entity_shader),pipeline/fullscreen.rs,manifest,codegen, thefullscreengolden.Checks
just test-rust -p window-core fullscreen: 17 passed. New: armour texture, and horse-mode pipeline emission (shaders, equipment, texture, manifest round trip, pack_format 84 rejected).just gradle :runtime:test --tests '*Fullscreen*'and:minestom:test --tests '*Fullscreen*': pass. New: horse mode sends no cursor run and hit-tests the same rotation; horse lock, unlock and no heart clamp.just golden: onlyfullscreenchanged. Three new files (entity.vsh, the equipment JSON, the armour PNG) plusdebug.jsonandWindowFullscreenEntries.kt.text.vsh, the include and the HUD shaders are unchanged, so unlocked-only packs are byte-identical.entity.vshwith its includes inlined compiles for all 32 combinations ofPER_FACE_LIGHTING,NO_OVERLAY,EMISSIVE,NO_CARDINAL_LIGHTINGandAPPLY_TEXTURE_MATRIX. A deliberately broken copy fails, so the check catches errors.just lint: clean.Not verified in a real client