Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
f9be06e
docs(inventory): record verified native cooking action rules
AlexProgrammerDE Oct 22, 2026
3405c41
fix(blocks): restore converted lobby geometry and block mappings
AlexProgrammerDE Oct 22, 2026
b656757
fix(render): retain native actor alpha references in Iris
AlexProgrammerDE Oct 22, 2026
b4ae088
fix(particles): resolve atlases outside the textures folder
AlexProgrammerDE Oct 22, 2026
4067a00
fix(models): retain geometry with omitted rendering fields
AlexProgrammerDE Oct 22, 2026
26b1dd7
fix(fluids): query authoritative native block layers
AlexProgrammerDE Oct 22, 2026
7db30a0
fix(fluids): render and refresh native secondary layers
AlexProgrammerDE Oct 22, 2026
fddc416
feat(inventory): execute client-authoritative authored chest actions
AlexProgrammerDE Oct 22, 2026
198a514
fix(inventory): preserve transaction item snapshots
AlexProgrammerDE Oct 22, 2026
6549169
fix(inventory): match native stack queries in authored transfers
AlexProgrammerDE Oct 22, 2026
2ff8555
feat(inventory): support authored redstone storage actions
AlexProgrammerDE Oct 22, 2026
e8dc7a4
fix(inventory): apply native occupied-slot merge eligibility
AlexProgrammerDE Oct 22, 2026
f5ba59d
docs(inventory): record native cooking snapshot boundaries
AlexProgrammerDE Oct 22, 2026
3583aef
docs(inventory): cover full native snapshot vectors
AlexProgrammerDE Oct 22, 2026
bd6079c
fix(entities): preserve native passenger membership decisions
AlexProgrammerDE Oct 22, 2026
fb09f15
docs(inventory): establish native cooking history order
AlexProgrammerDE Oct 22, 2026
e7b228e
fix(entities): match native passenger seat priority
AlexProgrammerDE Oct 22, 2026
68b2057
fix(cooking): use native merge rules for ingredient returns
AlexProgrammerDE Oct 22, 2026
ebd3e76
fix(ui): preserve menus when native images are unavailable
AlexProgrammerDE Oct 22, 2026
5a17631
docs(inventory): establish native transfer policy and request flow
AlexProgrammerDE Oct 22, 2026
9794b78
docs(cooking): establish native return execution and routing
AlexProgrammerDE Oct 22, 2026
c46f746
fix(replay): finish captures without orphaning the client
AlexProgrammerDE Oct 22, 2026
e1e248d
fix(cooking): preserve native command event phases
AlexProgrammerDE Oct 22, 2026
2b95bc0
fix(movement): preserve native correction clocks and vehicle motion
AlexProgrammerDE Oct 22, 2026
9a2b70e
docs(movement): record integrated correction validation
AlexProgrammerDE Oct 22, 2026
55ced08
docs(inventory): record registered native recipe input delivery
AlexProgrammerDE Oct 22, 2026
f9e22f8
fix(inventory): bind cooking actions to their collection cells
AlexProgrammerDE Oct 22, 2026
0fdc1b3
docs(inventory): record native repeated recipe placement
AlexProgrammerDE Oct 22, 2026
3cc346a
fix(movement): enforce retained correction clock bounds
AlexProgrammerDE Oct 22, 2026
15ef31e
fix(inventory): preserve native cooking request identities
AlexProgrammerDE Oct 22, 2026
45f9642
fix(inventory): track predicted cooking request identities
AlexProgrammerDE Oct 22, 2026
a3abfd9
test(inventory): verify finalized native cooking requests
AlexProgrammerDE Oct 22, 2026
370b22e
fix(movement): replay captured movement-effect inputs
AlexProgrammerDE Oct 22, 2026
063d6b6
feat(inventory): retain native transfer request batches
AlexProgrammerDE Oct 22, 2026
a6b2713
fix(movement): restore historical effect snapshots
AlexProgrammerDE Oct 22, 2026
50f4d22
docs(movement): record live snapshot validation limits
AlexProgrammerDE Oct 22, 2026
c160547
feat(inventory): execute native cooking recipe actions
AlexProgrammerDE Oct 22, 2026
56fe2d5
fix(replay): quit Minecraft before shutting down its launcher
AlexProgrammerDE Oct 22, 2026
568bdc2
fix(inventory): honor authored close button mappings
AlexProgrammerDE Oct 22, 2026
e682d93
fix(inventory): negotiate cooking channels in the correct direction
AlexProgrammerDE Oct 22, 2026
4387cad
fix(movement): ignore corrections without retained inputs
AlexProgrammerDE Oct 22, 2026
63048ac
feat(inventory): connect client cooking action transport
AlexProgrammerDE Oct 22, 2026
f77bb0c
feat(inventory): route authored cooking recipe pointers
AlexProgrammerDE Oct 22, 2026
6d02ab2
feat(inventory): connect cooking tab and filter controls
AlexProgrammerDE Oct 22, 2026
32334d8
feat(inventory): route authored cooking layout choices
AlexProgrammerDE Oct 22, 2026
98f0d18
feat(movement): replay actor physics for effect corrections
AlexProgrammerDE Oct 22, 2026
5116653
fix(ui): preserve authored order for equal native layers
AlexProgrammerDE Oct 23, 2026
ac2bdef
fix(ui): preserve native cooking controller captions
AlexProgrammerDE Oct 23, 2026
40ddeea
feat(movement): queue native corrections for physical replay
AlexProgrammerDE Oct 23, 2026
8bd2f42
fix(render): preserve native source alpha with Iris
AlexProgrammerDE Oct 23, 2026
a67b005
feat(movement): retain collision inputs during physical replay
AlexProgrammerDE Oct 23, 2026
da37f18
fix(attachables): match native item-slot bone lookup
AlexProgrammerDE Oct 23, 2026
ae9acf0
feat(movement): port native world collision traversal
AlexProgrammerDE Oct 23, 2026
ac4ac44
fix(attachables): share equipped animation and binding state
AlexProgrammerDE Oct 23, 2026
eb8075d
fix(attachables): match native explicit binding matrices
AlexProgrammerDE Oct 23, 2026
648b937
fix(inventory): admit food use with native hunger limits
AlexProgrammerDE Oct 23, 2026
6eb7b17
fix(particles): reset emitter creation query contexts
AlexProgrammerDE Oct 23, 2026
a0d9782
docs(movement): record native collider refresh prerequisites
AlexProgrammerDE Oct 23, 2026
b7c992e
fix(particles): refresh attached actor query inputs
AlexProgrammerDE Oct 23, 2026
e76668b
fix(particles): retire owned manual child emitters
AlexProgrammerDE Oct 23, 2026
4f06961
fix(movement): retain received actor spatial state
AlexProgrammerDE Oct 23, 2026
78e5dc1
fix(particles): preserve native child retirement order
AlexProgrammerDE Oct 23, 2026
9ea29ca
fix(movement): pack retained spawn angles like native
AlexProgrammerDE Oct 23, 2026
e686fb5
fix(particles): compose native emitter rate components
AlexProgrammerDE Oct 23, 2026
df67991
fix(movement): retain native interpolation packet metadata
AlexProgrammerDE Oct 23, 2026
07b5af8
feat(camera): execute native fixed-boom presets
AlexProgrammerDE Oct 23, 2026
ba0dd3a
docs(movement): specify native interpolation admission phases
AlexProgrammerDE Oct 23, 2026
811a8fb
fix(camera): retire lost fixed-boom attachments
AlexProgrammerDE Oct 23, 2026
b096cca
docs(inventory): document mode-dependent recipe focus
AlexProgrammerDE Oct 23, 2026
354158e
fix(movement): retain locally controlled vehicle poses
AlexProgrammerDE Oct 23, 2026
7185c10
feat(inventory): retain native focused recipe actions
AlexProgrammerDE Oct 23, 2026
109d8fb
docs(inventory): record native cooking search behavior
AlexProgrammerDE Oct 23, 2026
5fce481
docs(movement): specify native history and interpolation routing
AlexProgrammerDE Oct 23, 2026
f8cac08
fix(items): retain ordinary names for empty display components
AlexProgrammerDE Oct 23, 2026
0d88b0e
docs(movement): record history sampling target handoff
AlexProgrammerDE Oct 23, 2026
7fe1892
fix(inventory): retain cooking screens while carrying items
AlexProgrammerDE Oct 23, 2026
287aa14
feat(inventory): add native cooking search primitives
AlexProgrammerDE Oct 23, 2026
e7f2539
fix(nbt): preserve raw strings in native item data
AlexProgrammerDE Oct 23, 2026
b035720
docs(movement): record retained history sampler validation
AlexProgrammerDE Oct 23, 2026
bbd1889
fix(items): preserve native written-book name selection
AlexProgrammerDE Oct 23, 2026
0d57ee4
fix(items): retain display names across partial updates
AlexProgrammerDE Oct 23, 2026
9aa7cb9
fix(movement): replay ticked actor velocity commands
AlexProgrammerDE Oct 23, 2026
ac0db93
fix(text): match native language parsing and formatting
AlexProgrammerDE Oct 23, 2026
c41b533
fix(movement): preserve mounted input frame bindings
AlexProgrammerDE Oct 23, 2026
71c9283
chore(stack): integrate native language updates
AlexProgrammerDE Oct 23, 2026
97757bf
fix(items): resolve component names from registry state
AlexProgrammerDE Oct 23, 2026
54b0422
docs(movement): record live mounted replay verification
AlexProgrammerDE Oct 23, 2026
5a68cf8
chore(stack): preserve component registry naming updates
AlexProgrammerDE Oct 23, 2026
349b33d
fix(movement): validate replay owners against live lifetimes
AlexProgrammerDE Oct 23, 2026
71e81ab
fix(items): resolve constructor-owned native names
AlexProgrammerDE Oct 23, 2026
492c2bc
docs(movement): define native collider packet sources
AlexProgrammerDE Oct 23, 2026
5e2694c
fix(items): resolve descriptor-aware native names
AlexProgrammerDE Oct 23, 2026
3fd3288
fix(movement): refresh replay colliders from native sources
AlexProgrammerDE Oct 23, 2026
f9c638d
chore(sync): merge descriptor-aware native names
AlexProgrammerDE Oct 23, 2026
bf19dea
fix(items): compose native ordinary name suffixes
AlexProgrammerDE Oct 23, 2026
11ec6d1
fix(movement): initialize collider sources after actor snapshots
AlexProgrammerDE Oct 23, 2026
860f372
chore(sync): preserve native item-name append composition
AlexProgrammerDE Oct 23, 2026
5d2888d
docs(movement): record integrated collider source validation
AlexProgrammerDE Oct 23, 2026
0eb8768
fix(movement): retire remote player interpolation on resets
AlexProgrammerDE Oct 23, 2026
b2491cd
docs(movement): record native player throttle transitions
AlexProgrammerDE Oct 23, 2026
bafd199
docs(movement): verify native throttle configuration gates
AlexProgrammerDE Oct 23, 2026
9fa50f4
docs(movement): verify mounted active use and throttle inputs
AlexProgrammerDE Oct 23, 2026
6dd4778
docs(movement): verify native player readiness publication
AlexProgrammerDE Oct 23, 2026
4d6bee8
docs(movement): verify native remote-player tick lifecycle
AlexProgrammerDE Oct 23, 2026
3b8a11c
feat(inventory): resolve native block-backed item names
AlexProgrammerDE Oct 23, 2026
6f3dc83
docs(inventory): record native world version ownership
AlexProgrammerDE Oct 23, 2026
dad0a32
feat(inventory): resolve native potion names by world version
AlexProgrammerDE Oct 23, 2026
ea0f2c0
feat(inventory): resolve native arrow names
AlexProgrammerDE Oct 23, 2026
4a98e8c
docs(ui): record WildFFA inventory release controls
AlexProgrammerDE Oct 23, 2026
fc1d47d
fix(inventory): preserve native compound item names
AlexProgrammerDE Oct 23, 2026
0de218e
docs(inventory): record native toggle input requirements
AlexProgrammerDE Oct 23, 2026
ac98102
docs(inventory): record native focus and hover delivery
AlexProgrammerDE Oct 23, 2026
dee3d81
fix(ui): match native component flag types and focus defaults
AlexProgrammerDE Oct 23, 2026
61589e6
feat(ui): apply native directional focus contexts
AlexProgrammerDE Oct 23, 2026
8098c56
feat(inventory): route native component input and preference events
AlexProgrammerDE Oct 23, 2026
717ab07
fix(inventory): clear exited native recipe selections
AlexProgrammerDE Oct 23, 2026
3ef0387
feat(inventory): route native cooking tab actions
AlexProgrammerDE Oct 23, 2026
80a9898
fix(ui): preserve authored cooking screen hosts
AlexProgrammerDE Oct 23, 2026
88e6ccc
fix(ui): match native declaration inheritance
AlexProgrammerDE Oct 24, 2026
04c558a
fix(ui): honor authored view navigation
AlexProgrammerDE Oct 24, 2026
12e7a4b
fix(ui): preserve native global input phases
AlexProgrammerDE Oct 24, 2026
b4986c8
fix(ui): route authored view tab groups
AlexProgrammerDE Oct 24, 2026
e1c6104
fix(ui): preserve native focused tab delivery
AlexProgrammerDE Oct 24, 2026
29a70b3
docs(ui): correct native Button state evidence
AlexProgrammerDE Oct 24, 2026
059ba27
fix(ui): retain native Button appearance and consumption
AlexProgrammerDE Oct 24, 2026
3fb4df2
fix(ui): preserve native visibility and hidden captures
AlexProgrammerDE Oct 24, 2026
24ac829
fix(ui): preserve synchronous native visibility callbacks
AlexProgrammerDE Oct 24, 2026
90ed097
docs(ui): record the complete native mode-change lifecycle
AlexProgrammerDE Oct 24, 2026
a36bea3
fix(ui): initialize native cooking input phases
AlexProgrammerDE Oct 24, 2026
609c82f
fix(ui): seed cooking hover before the first frame
AlexProgrammerDE Oct 24, 2026
1aeec49
fix(inventory): synchronize player inventory preferences
AlexProgrammerDE Oct 24, 2026
1351412
docs(ui): record native player inventory portrait behavior
AlexProgrammerDE Oct 24, 2026
c576af1
feat(ui): render native local-player portraits
AlexProgrammerDE Oct 24, 2026
215eef5
fix(inventory): track installed player screen lifetimes
AlexProgrammerDE Oct 24, 2026
97c4a1b
docs(inventory): record native player controller bindings
AlexProgrammerDE Oct 24, 2026
7fb88cb
feat(inventory): share native recipe collection state
AlexProgrammerDE Oct 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/bedrock-development-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ Read the local generated checkout before changing a patch. The links to `main` h
| [ViaFabricPlus Bedrock add-on](https://github.com/ViaVersionAddons/viafabricplus-bedrock) | Check client integration, network hooks, rendering, and account UI. |
| [ViaVersion](https://github.com/ViaVersion/ViaVersion) | Check the translation API and Java protocol mappings. |
| [StackAnvil patch workflow](patch-workflow.md) | Edit the generated checkout and rebuild the patch series. |
| [Native cooking action reference](native-cooking-actions.md) | Check verified cooking dispatch, source, quantity, and item-return behavior and its remaining limits. |

For a specific feature, search the local `protocol/packet`, `protocol/types`, and `protocol/data` directories. For maps, skins, login, and resource packs, start with `MapPackets`, `SkinType`, `LoginPackets`, and `ResourcePackPackets`. Some of these files are StackAnvil patches and do not exist on upstream `main`.

Expand Down
35 changes: 35 additions & 0 deletions docs/lobby-survey.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,3 +371,38 @@ All 26 recorded process identities closed normally across these four runs.
Screenshots, packet journals, ray observations, and accepted packs remain private.
The attempted video capture did not produce a valid recording.
These survey results add reproductions, without a claim that the rendering defects are fixed.


## Galaxite block conversion follow-up, 22 October

The saved Galaxite palette contains 3,661 custom states.
The old 2,629-carrier limit leaves 734 states mapped to coarse dirt.
The expanded pool provides 3,500 carriers and assigns every recorded state to 3,340 visuals.
The compiler also checks reusable visuals after reaching capacity.

The same recording exposes 88 states with orphaned geometry bones.
The compiler now preserves their remaining local transforms and retains cycle rejection.
One block references geometry stored under `models/entity`.
Block geometry lookup now covers the complete `models` directory.

Eight fancy-table states have vertices outside Java's cuboid range.
Core marks those elements, and the add-on preserves their authored coordinates during model loading.
Ordinary Java models retain their existing validation.
Malformed, non-finite, and oversized coordinates remain invalid.

An independent comparison against Java 26.3 assets verifies 4,246 block-state selectors across 27 block types.
It checks 701 custom assignments and preserves every unassigned vanilla selector.
The full build passes 2,354 tests, with 152 optional fixture skips and no failures or errors.

A fresh default-OpenGL Galaxite connection reaches a playable lobby and completes its 30-second capture.
Its journal includes spawn, player initialization, and movement acknowledgments.
The client reports no custom-block mapping, geometry-conversion, or model-loading errors.
The screenshot is partly occluded by another player.
This verifies scene loading and model acceptance, but does not establish complete native appearance parity.
A forced software-Vulkan attempt and a later longer run disconnect before spawn.
Their failures remain separate from the successful recording.

The broader audit includes 29 saved public-server connections, with their recorded pack order and bundled native images.
Mob Maze still exceeds the expanded carrier capacity with its much larger declared palette.
Other retained failures include missing pack assets, unsupported material methods, and unresolved legacy custom visuals.
These remain active work, alongside live interaction checks and the earlier entity, UI, and item findings.
1,376 changes: 1,376 additions & 0 deletions docs/native-cooking-actions.md

Large diffs are not rendered by default.

237 changes: 237 additions & 0 deletions docs/native-player-inventory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
# Native player inventory

This reference supports the remaining player-inventory implementation. It describes the target renderer and the current Java integration gaps.

## Current integration

Release 0.3.53 synchronizes player-inventory preferences and preserves independent inventory and workbench layouts.
The E-key path still opens Java's inventory screen.
The native inventory asset requires `live_player_renderer`, armor and crafting collections, recipe controls, tabs and search.
The shared Java renderer now supports `live_player_renderer` through the actual local player.
It preserves separate actor, body and head rotations and applies the native model transform after Java's portrait translation.
Form, NPC and container adapters admit the new renderer. Release 0.3.54 includes these portrait changes.

## Installed-screen lifecycle

Release 0.3.55 includes the installed-screen lifecycle bridge.
The client sends an opening request after `Gui.setScreen` installs the actual inventory screen.
Constructing an unused screen does not open the Bedrock inventory.
The bridge supports direct translation and ViaProxy through the same negotiated payload.
Java creative inventory also opens the native player inventory, while its item picker retains its existing presentation.

Each installed opening receives a monotonic token for its connection.
An ordinary reopen receives a new token, even though Java retains the same player menu object.
A genuine native presentation swap retains the token.
Tokens remain monotonic across play-listener replacements and physical reconnects.
A late capability announcement does not replace an existing legacy opening or send a duplicate native request.

The Bedrock open acknowledgment does not carry this token.
The core therefore serializes openings and retains retired requests until their acknowledgments arrive.
A new screen waits for the previous native close acknowledgment.
Old screen clicks cannot replay into that new opening.
Independent global inventory actions can use a retired acknowledgment before the temporary inventory closes.
Timeout closes the matching client screen and retains the unresolved native request.

Server closes identify the owning client token through a separate payload.
A stale close cannot close a newer screen or another connection.
The bridge replaces the constructor trigger and preserves the legacy installed-screen fallback for older direct translators.
The full authored inventory layout, recipes, tabs, search and physical controller input remain unfinished.

## Controller state and collection reference

The target constructor is `0x144e0f520`. Its binding registrations use 32-bit FNV-1a hashes of the complete property names, including `#`.
The registered callback at `0x144e5b410` implements `#is_creative_mode` and calls `0x144923190`.
This shared helper checks creative mode. It does not identify the active input device.
The earlier cooking reference called it an input accessor without establishing its meaning.

The helper reads actor component `0x88d3eddf` through the original sparse registry.
Raw game type `1` returns true. Raw game type `5` returns true only when the fallback getter returns `1`.
An absent player, absent component, missing page, stale entity generation or raw value `-1` returns false.
The reference executes 640 cases through both the original helper and the registered callback, for 1,280 calls.
Actor delivery, component backing and the fallback virtual getter remain supplied interfaces.

The constructor also stores an independent flag at offset `0x1319`.
Its producer compares a virtual service result with `1`; the service comes from client vtable offset `0x578`, then service vtable offset `0x70`.
The service type remains unverified. The implementation must not substitute the effective creative predicate or the input mode for this flag.

### Layout and tabs

The original property getters select these numeric values:

| State | Value | Property |
| --- | --- | --- |
| Layout | 1 | `#is_survival_layout` |
| Layout | 2 | `#is_recipe_book_layout` |
| Layout | 3 | `#is_creative_layout` |
| Left tab | 1 | `#is_left_tab_construct` |
| Left tab | 2 | `#is_left_tab_equipment` |
| Left tab | 3 | `#is_left_tab_items` |
| Left tab | 4 | `#is_left_tab_nature` |
| Left tab | 5 | `#is_left_tab_search` |
| Left tab | 6 | `#is_left_tab_inventory` |
| Right tab | 1 | `#is_right_tab_fullscreen` |
| Right tab | 2 | `#is_right_tab_crafting` |
| Right tab | 3 | `#is_right_tab_armor` |

The constructor selects the active saved layout for inventory or workbench and retains the other layout separately.
Its default is `3` for creative inventory and `2` otherwise. Workbench always uses default `2`.
Saved `0` and positive values greater than `3` use that default. Negative values remain unchanged.
The independent constructor flag forces the default. Saved layout `3` becomes `2` outside creative inventory.
These rules do not change the raw saved preferences.

The constructor normalizes tabs too. Without the independent flag, left tab `6` becomes search tab `5`.
With that flag, input mode `3` and noncreative state select inventory/armor tabs or search/crafting tabs, according to screen type.
Noncreative fullscreen right tab `1` becomes crafting tab `2`.
The raw filtering preference remains separate from the recipe model's effective filter, which is disabled in creative mode.

The bounded constructor reference executes 3,472 combinations of layouts, tabs, filtering, both flags, screen type and controller input mode.
Each case then executes sixteen original property getters, for 55,552 getter calls.
The reference supplies model-filter updates and initial tab publication. It disables the separate restricted-tab policy.
Full construction, restricted-tab availability, device delivery and visible pixels remain unverified.

### Logical item and recipe collections

The original initializer at `0x1431bd020` constructs 67 collection names.
The executed slice uses supplied map nodes and sufficient string capacity. Native hash insertion and string allocation remain outside this reference.
The player model requires these distinct collections:

| Native ID | Collection |
| --- | --- |
| 6 | `armor_items` |
| 12 | `combined_hotbar_and_inventory_items` |
| 13 | `crafting_input_items` |
| 14 | `crafting_output_items` |
| 15 | `recipe_construction` |
| 16 | `recipe_nature` |
| 17 | `recipe_items` |
| 18 | `recipe_search` |
| 20 | `recipe_equipment` |
| 28 | `hotbar_items` |
| 29 | `inventory_items` |
| 34 | `offhand_items` |
| 59 | `cursor_items` |
| 60 | `creative_output_items` |

Model builder `0x1434360d0` creates the item collections and four category recipe collections through `0x143438210`.
It also creates a separate search collection. These recipe collections share constructor `0x143443e50`.
The category counts use the source category's group references; search uses the complete source list.
This model construction evidence comes from disassembly. Production recipe acquisition, category assignment, availability evaluation and mutation remain unfinished.
The player screen must retain the complete catalog and recipes that need a crafting table.
A fabricated empty recipe catalog cannot establish support for the default inventory asset.

## Shared recipe collections

The shared `RecipeCollection` model implements the target collection ordering and retained header expansion.
Cooking uses the same partitioner for its flat visible recipe prefix.
The player controller still needs a complete catalog producer before it can use grouped collections.

Entries retain four stable evaluator buckets.
A contiguous catalog group moves as one run: state zero wins, then state one; otherwise the first member selects state two or three.
Unfiltered grouped refreshes skip availability evaluation.
Flat refreshes still evaluate entries and merge states one and two when filtering is disabled.
Invalid entries do not split a pending group or invoke the evaluator.
Grouped projection includes valid groups beyond the flat eligible prefix.

Grouping uses catalog object identity. Expansion history instead matches the header icon and count.
Refresh retains expanded headers across ordering and filtering changes, including an intervening flat refresh.
An explicit reset clears that history. Header expansion reports its visible position and member count.
The caller must validate the selected header before invoking this operation.
Native action admission and arbitrary item activation remain separate controller work.

The original routines are `0x143445150`, `0x143446b90`, `0x143447710` and `0x143447ab0`.
The shared Java implementation matches 4,128 original collection cases and sixteen retained-state steps.
The steps cover expansion history and groups with equal icons but different identities or counts.
Native vector allocation and cleanup execute. Item copy/destruction, icon equality, availability evaluation and external callbacks use supplied boundaries.
These checks do not establish recipe acquisition, unlocks, craftability, full controller ownership, physical input or visible screen parity.
Six focused regressions cover ordering, representative identity, filtering, invalid entries, expansion history and immutable snapshots.
The complete build passes 2,823 tests, with 163 optional skips and no failures or errors.
All 1,465 core classes match the embedded add-on and proxy copies; all 1,191 client classes match the tested add-on.
The packaged core repeats all 4,144 recipe comparisons with its class origin verified.

## Target and original functions

The reference uses Bedrock 1.26.51.1, build 51061372, protocol 2193.
The binary SHA-256 is `537c0aee2e79afbdc94b44b28e00f466ae62bc50e2733d953b430db9dbaa9ee7`.

| Function or component | Address or identifier | Role |
| --- | --- | --- |
| Live player draw | `0x148ddd910` | Reads the local actor and constructs the preview |
| Cursor delta helper | `0x148de0020` | Reads `#look_at_cursor` and the current input source |
| Body-yaw getter | `0x14207f2b0` | Reads current and previous body yaw |
| Body-yaw setter | `0x14204d890` | Writes current and previous body yaw |
| Actor rotation | Actor offset `0x228` | Stores pitch and yaw separately from yaw history |
| Body-yaw history | Component hash `0xd7f64bba` | Stores two body-yaw values |
| Head-yaw history | Component hash `0xbabe7211` | Stores two head-yaw values |

The renderer factory selects different draw functions for live player and horse controls.
The live player draw uses the local actor directly. It does not select an actor through the horse control's `#entity_id`.

## Framing and pose

The control center determines the preview position. The smaller control dimension determines its scale.
The actor rotation, body-yaw history and head-yaw history remain separate throughout the draw.

| Native state | Preview behavior |
| --- | --- |
| Standing | Uses the control center and the smaller dimension |
| Swimming or crawling | Moves the preview center upward by 20 logical units |
| Gliding | Moves the center downward by 15 units, uses 60% scale and a fixed 10-degree tilt |

Gliding takes precedence over swimming and crawling. Its actor rotation remains unchanged.
Its body yaw becomes zero, while its head yaw retains the difference between the original head and body values.

For ordinary poses, cursor deltas use the control center minus the cursor position.
Their angles use `atan(delta / 40)`.
The pitch multiplier is `-20`, the actor/head-yaw multiplier is `40`, and the body-yaw multiplier is `20`.

The cursor helper requires a true boolean `#look_at_cursor` property.
Raw input mode `1` reads the native mouse coordinates and GUI scale.
Other captured modes use a separate cursor object and two admission getters.
An absent or inactive cursor contributes zero deltas.
The admission getters' physical producers remain unverified.
The current Java adapter supplies mouse coordinates. Physical controller and touch delivery remain unfinished.

The draw temporarily changes the admitted mount's body yaw too.
The normal return restores actor rotation, both yaw histories and the mount's body yaw.

## Executed reference and limits

The private reference executes 672 original draw calls through normal return with an absent renderer result.
It covers seven pose combinations, three control shapes, eight cursor configurations, mount presence and head-yaw component presence.
The original sparse component lookups, body-yaw getter/setter, matrix arithmetic and restoration instructions execute.
Every case restores the supplied player and mount values.

The fixture supplies local actor delivery, flags, cursor admission values, matrix-stack bookkeeping and renderer-context boundaries.
Host float math supplies `atanf`, `sinf` and `cosf`.
The absent renderer result skips successful renderer submission, renderer variables and effects.
The reference does not establish GPU output, clipping, physical input delivery or visible native parity.

## Java implementation checks

The full stack passes 2,817 tests, with 163 optional skips.
Three packaged camera regressions pass and reject four deliberately incorrect implementations.
The native comparison covers framing, actor rotation and body yaw in all 672 cases.
Head-yaw comparisons cover the 336 cases with that component present.
The prior 35 screen regressions and 1,940 UI input reference cases also pass.

Two private Java 26.3 clients verify actual entity submission at 854 by 480 and 1920 by 1013 pixels.
Their Java/native GUI scale pairs are 2/1 and 3/4.
The checks retain 36 submission samples across twelve supplied scene stages.
They cover cursor tracking, pose-specific framing and a malformed horse-style entity ID that the local-player renderer ignores.
Every observed preview draw preserves the world player's rotation fields.
Private screenshots show the local player at both viewport sizes.

These client checks supply the scene and native pose flags. They do not reproduce genuine world gliding or the authored inventory controller.
Native visible comparisons, successful native renderer variables, converted skins, equipment, emotes, GUI effects and Iris comparisons remain incomplete.
Actual mounted preview queries and seat ownership also need verification.
An isolated Java 26.3 client completes four real E-key openings through ViaProxy and Bedrock 1.26.51.1.
Two openings use survival inventory, then two use the creative picker after a server mode change.
Each receives a matching native open and close acknowledgment without an inventory click.
All four retain the same persistent player-menu object and use distinct opening tokens.
Constructing an unused inventory screen sends no native request.
Private screenshots confirm that these remain Java's ordinary survival and creative screens.

The installed-screen bridge has sixteen packaged lifecycle and codec regressions.
The full player-inventory controller and physical input delivery remain unfinished.
Direct joins, creative item actions, reconfiguration and recovery under packet delay still need live verification.
All five implementation areas and the four original bug reports remain open.
2 changes: 1 addition & 1 deletion patches/cubeconverter/series.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"upstreamable": [
{
"file": "0001-preserve-invisible-bedrock-cubes.patch",
"title": "fix(models): preserve cubes without visible faces"
"title": "fix(models): preserve invisible geometry and native defaults"
},
{
"file": "0002-preserve-actor-lighting-controls.patch",
Expand Down
Loading
Loading