Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6ee0050
perf(ui): bound inventory grids to their visible rows
AlexProgrammerDE Oct 31, 2026
165906e
fix(network): wait for Java protocol acknowledgments
AlexProgrammerDE Oct 31, 2026
5b650dd
fix(ui): accept Lifeboat authored form expressions
AlexProgrammerDE Oct 31, 2026
b3f6cc3
docs(ui): record verified Lifeboat form navigation
AlexProgrammerDE Oct 31, 2026
9c9ad66
fix(inventory): keep Creative catalog cells active
AlexProgrammerDE Oct 31, 2026
82132ee
fix(blocks): honor server-defined vanilla registrations
AlexProgrammerDE Oct 31, 2026
0688428
fix(ui): preserve authored grid population and item limits
AlexProgrammerDE Oct 31, 2026
8689fff
fix(inventory): admit the full creative cursor quantity
AlexProgrammerDE Oct 31, 2026
b78e168
fix(servers): resolve hosted experience network destinations
AlexProgrammerDE Oct 31, 2026
7d4008a
fix(servers): preserve hosted join layouts and actor bindings
AlexProgrammerDE Oct 31, 2026
fa0943d
fix(ui): restore authored hosted-server menus
AlexProgrammerDE Oct 31, 2026
f4efdd5
fix(inventory): restore backdrop opacity and reuse scene geometry
AlexProgrammerDE Oct 31, 2026
7740f62
fix(effects): tolerate absent native effect removals
AlexProgrammerDE Oct 31, 2026
c96532e
fix(ui): preserve native JPEG resources through pack conversion
AlexProgrammerDE Oct 31, 2026
d928b8c
fix(animations): retain playback after invalid timeline scripts
AlexProgrammerDE Oct 31, 2026
bc62ab8
fix(ui): avoid per-frame static animation traversal
AlexProgrammerDE Oct 31, 2026
9260d11
fix(inventory): hide gameplay HUD behind native containers
AlexProgrammerDE Oct 31, 2026
50de47a
docs(render): record native shield state controls
AlexProgrammerDE Oct 31, 2026
e7eb16d
feat(capture): record hotbar context in movement audits
AlexProgrammerDE Nov 1, 2026
8bb9f78
fix(interaction): preserve throwable selection and consumption
AlexProgrammerDE Nov 1, 2026
36a69a1
perf(inventory): retain stable native draw lists
AlexProgrammerDE Nov 1, 2026
eb400a7
feat(inventory): allow Java inventory screens
AlexProgrammerDE Nov 1, 2026
f4fa508
fix(inventory): finish authored screen exits
AlexProgrammerDE Nov 1, 2026
8dd7d28
fix(ui): retain native storage hosts and hurt policy
AlexProgrammerDE Nov 1, 2026
6d4a642
fix(ui): match native text color conversion
AlexProgrammerDE Nov 1, 2026
dfdd93f
fix(inventory): restore authored tab and layout selection
AlexProgrammerDE Nov 1, 2026
43b28d3
fix(inventory): initialize native player profile defaults
AlexProgrammerDE Nov 1, 2026
be7c44b
docs(inventory): record verified bundle transfer behavior
AlexProgrammerDE Nov 1, 2026
0a6cd01
docs(rendering): record shield movement and projectile controls
AlexProgrammerDE Nov 1, 2026
a715937
refactor(blocks): load conditional registrations from Cloudburst NBT
AlexProgrammerDE Nov 1, 2026
acfa513
fix(inventory): clear occupied Creative catalog cursors
AlexProgrammerDE Nov 1, 2026
3ab33bb
feat(inventory): support native Creative catalog inputs
AlexProgrammerDE Nov 1, 2026
308d97e
fix(inventory): match native Creative hotbar actions
AlexProgrammerDE Nov 1, 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
3 changes: 2 additions & 1 deletion docs/bedrock-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ No complete area has verified Bedrock parity.
| World resources | World base-game version selects vanilla metadata, textures, actor graphs, and audio before server overrides. The context survives ViaProxy. Server legacy biome bindings retain unqualified names across versions. | Native current/older/current cat, sound, and remote biome-name controls cover selected paths. Broader pose and audio behavior need comparisons. |
| Held trapdoors | Retained facing and half, interaction suppression, use timing, cancellation, rejection, and prediction reconciliation. | Native, direct, and proxy controls cover specific held-placement histories. Other placement and interaction families need separate comparisons. |
| Fonts and UI | Bitmap metadata, extended mapping, same-pack ownership, legacy layouts, authored scenes, and native GUI sampling. | At 1280 × 720, current controls match all 16 labels at native UI scales 1 and 2; legacy scale-2 controls match 16/16. Both routes pass Java GUI scale changes and reloads. Broader viewports and TrueType comparisons remain open. |
| Player inventory and crafting | Opening ownership, recipe catalogs, compressed snapshots, local Help, inactive item lighting, native storage weights, and native stack identities. | Complete E-key/workbench presentation, full Creative catalogs, bundle actions/tooltips, bulk recipe actions, cursor replacement, and original live bug reports remain unresolved. See the [inventory reference](native-player-inventory.md). |
| Player inventory and crafting | Opening ownership, recipe catalogs, Creative catalog actions, compressed snapshots, local Help, inactive item lighting, native storage weights, and native stack identities. | Complete E-key/workbench presentation, bundle actions/tooltips, bulk Survival recipe actions, and original live bug reports remain unresolved. See the [inventory reference](native-player-inventory.md). |
| Cooking | Snapshot-bound recipe actions, transfer batches, preferences, search, and progress. | Default cooking screens retain ordinary controls until authored bindings are complete. See the [cooking reference](native-cooking-actions.md). |
| Skins and appearance | Complete skin transport, classic changes, persona assembly, animation graphs, costumes, and attachables. | Broader wardrobe masking, profile/LOD changes, shield rendering, remote appearances, and account/platform flows need further native comparisons. See [skin support](skin-flow.md). |
| Movement and effects | Completed physics frames, retained prediction history, correction replay, terrain queries, and authoritative impulses. Overworld air blindness attenuates night-vision strength and fog color together. Both Java routes match native water-boundary fall controls. | Native Fancy controls establish the tick-based expiry blend and distance curve at noon and midnight. Other fluid movement, vision combinations and media, mount variants, network conditions, and broader replay behavior remain open. |
Expand All @@ -39,6 +39,7 @@ No complete area has verified Bedrock parity.
Retain these reports until a matching reproduction establishes the result:

- WildFFA inventory opened with E shows items without the expected background.
- An update from 0.3.61 to 0.4.2 caused reported inventory lag spikes, overlapping menus, and an extreme shield pose.
- An ender pearl followed by a wind charge can cause repeated rollbacks.
- Food can repeat its use animation without feeding the player.
- The locator bar can be absent.
Expand Down
84 changes: 78 additions & 6 deletions docs/native-player-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
Use this reference when changing the E-key inventory, creative catalogs, or authored player-screen integration.
The [compatibility status](bedrock-coverage.md) lists unresolved reports.

## Use Java inventory screens

In the ViaFabricPlus Bedrock settings, turn off **Bedrock inventory screens**.
Then reopen the inventory or container.
This setting covers player inventory, crafting, cooking, and storage screens on direct and ViaProxy connections.
It leaves server forms, HUD rendering, and inventory protocol handling unchanged.

Bedrock inventory screens are enabled by default.
Server resource packs can depend on their layouts and controls.
Java screens do not reproduce those custom layouts.

## Screen lifetime

Open the Bedrock inventory only after Java installs the actual screen.
Expand All @@ -17,6 +28,24 @@ Bind clicks, data, and closes to the connection, menu object, menu ID, and openi
A stale reply must not operate on a replacement screen.
Keep global player-inventory reconciliation independent of a retired temporary menu.

Escape starts the authored pop exit before the screen closes.
The gameplay HUD appears behind the outgoing scene.
The host consumes input and waits for all participating `screen.exit_end` tracks.
A repeated close request does not restart the exit.
Completion can close only the same screen and menu.
A scene without a completion path closes immediately.

Storage scenes retain the complete authored host, including the backdrop, close button, and exit tracks.
Server-delivered hurt events retain the original damage cause and local actor lifetime.
The shared player state applies the native cause filter and pending-event check before the screen policy.
At a zero counter, a pending event starts the 100-update gate even when the current screen stays open.
Events during that gate are consumed rather than deferred.
Health changes alone do not trigger this policy.

Programs advertise this behavior through the versioned core hurt contract.
Without that contract, screens that require the hurt policy retain ordinary controls.
Separate admission checks still exclude unfinished cooking bindings.

The installed opening also owns a read-only recipe context while the native acknowledgment is pending.
It reads the real cached crafting grid, hotbar, inventory, and cursor.
The acknowledgment retains this model and its captured search policy.
Expand All @@ -25,9 +54,11 @@ A workbench model belongs to its exact container generation.

`NativePlayerRecipeState` advances the retained collections and refreshes them when sources, recipes, unlocks, rules, or preferences change.
Catalog replacement refreshes source collections without reconstructing the backend or replacing its query and selected output.
Missing profile preferences remain absent.
The backend starts with the observed native filtering value, then accepts actual profile settings.
No selected tab is inferred from Java recipe-book defaults.
The native player profile starts with Search, Crafting, filtering off, and automatic layouts.
The controller reads this profile before an inventory-options packet arrives.
Server packets replace all five fields, including explicit zero tabs.
Java filter changes retain the native tabs and automatic layouts.
Fresh direct and ViaProxy sessions retain this state across first opening and reopening without an inventory-options packet.

The same negotiated messages serve direct and ViaProxy connections.
Late capability announcements must not duplicate a legacy opening.
Expand All @@ -54,6 +85,18 @@ A change in raw text can retire selection even when normalized text is unchanged
Survival counts combine candidate recipes and share their source budget. Creative counts read the current game mode and source output amount.
The displayed total can exceed the quantity that one selected candidate can craft.

Fixed recipe grids use cell windows over the complete retained collection.
The source keeps its original order, item identities, and total scroll extent.
Each view expands the visible rows and a one-row buffer on each side.
An offscreen keyboard selection also retains its neighboring rows.
Resize and scroll changes preserve the original collection indices and action targets.
Window changes do not advance the authoritative snapshot revision.

Only horizontal grids with fixed cell geometry support this contract.
Row-dependent dimensions and redirected root indices restore ordinary controls.
The node budget remains unchanged.
These windows preserve authored geometry but do not establish identical native pooling or frame timing.

## Actions and presentation

Core owns requests, network stack IDs, transfer quantities, prediction, and server response reconciliation.
Expand Down Expand Up @@ -93,15 +136,44 @@ Both routes return from Help with a carried stack and confirm its placement thro
Inactive item icons use separate lighting and opacity. The default disabled light multiplier is 0.25.
Typed overrides and RGB conversion match selected native instruction controls. Complete material and pixel parity remain unverified.
Storage bars read a native weight snapshot independently of Java bundle contents.
Installed direct and ViaProxy controls retain a server-issued empty bundle in the Survival menu after reopening.
Installed direct and ViaProxy controls insert eight logs into a server-issued empty bundle, extract them, and insert them again.
Both routes retain the filled bundle after reopening, with server responses that accept each request.
These checks use ordinary Java 26.3 controls after the storage-tooltip fallback. Left-click inserts items; right-click extracts them.
The first insertion request from the official Bedrock client remains unverified.
Filled-bundle bars still need installed native comparison.
Unknown storage snapshots restore ordinary controls.
Hovering or carrying storage items also restores ordinary controls until native tooltips and selection are complete.
Unsupported visible Help glyphs, recipe auxiliary actions, and held-selection commands also restore ordinary controls.
Large Creative catalogs exceed the current scene work budget. Viewport expansion remains unfinished.
Initial bundle insertion, bulk recipe actions, Creative cursor replacement, and complete installed native parity remain unfinished.
The Creative catalog-only toolbar binds Shift-left-click and Shift-right-click to full-stack destruction.
The action preserves the cursor, requires a current acknowledged opening, and leaves empty slots unchanged.
Inventory-only and recipe-book layouts use the authored quick-move command to preserve an occupied cursor during stack transfer.
Backends without the separate destruction capability restore ordinary controls before item changes or requests.
Installed direct and ViaProxy controls confirm destruction and occupied-cursor transfer through successful server responses and retained inventory after reopening.
Installed direct and ViaProxy controls retain the complete 1,980-item catalog from a local protocol-2225 server.
Tab and layout controls use the target inventory indices.
Both routes search for rails and place a server-accepted stack of 64 in the hotbar.

Official Bedrock 1.26.60.5 controls establish the Creative catalog pointer actions.
Primary click takes a full stack into an empty cursor or discards the entire held stack.
Secondary click takes one item into an empty cursor or discards one held item.
Shift-left-click and Shift-right-click place a full stack in inventory without changing the cursor.
Bulk placement merges existing stacks before filling empty hotbar and main-inventory slots, then stops at the available capacity.
A full inventory accepts the input without an inventory request.

Unchanged Java Creative slot echoes preserve the existing native stack and network ID.
Installed direct and ViaProxy controls confirm these pointer, capacity, and reopening cases through successful server responses.

Bulk Survival recipe actions and complete installed native parity remain unfinished.
Native constructor timing relative to the open acknowledgment and frame-level population timing remain unverified.
An unpositioned player inventory uses the fallback crafting context.
Native model-position initialization and arbitrary custom component admission remain unverified.
The original inventory-background, rollback, food-use, and locator-bar reports remain unresolved.
Native registry probes and local model tests do not establish complete live inventory parity.
Installed direct and ViaProxy controls cover complete chest, hopper, brewing, and large-chest hosts, including exits and the close button.
Both routes retain 64 logs after server-accepted pickup and return requests.
Damage controls cover accepted and excluded causes, gated events, a false inventory policy, and remote actors.
Native Bedrock 1.26.60.5 runtime controls establish the pending-state and counter order for server-delivered hurt events.
Client-predicted damage, the live producer for actor event 81, and exact frame timing remain unverified.
The historic hurt-and-heal nonclosure with a 5.6-millisecond packet gap remains unexplained.
Text channels use native byte truncation and clamping, including opacity.
Complete screen pixels remain unverified.
10 changes: 9 additions & 1 deletion docs/server-replay.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ For another public server, use its current address from the in-game catalog or t
bun run server-replay record public --target play.example.org:19132 --client addon --seconds 240
```

Public targets also accept `nethernet://host:port`. The private manifest records the selected endpoint.
Public targets also accept `nethernet://host:port`.
Hosted Xbox JSON-RPC experiences use `nethernet-xbox-json-rpc://network-id` with `--client addon` or `--client proxy`.
Resolve a fresh network ID through the catalog before connecting. These IDs have no port.
The private manifest records the selected endpoint.
Catalog experiences can use temporary endpoints, so resolve the address again before a later run.
Named targets retain their configured address. Local targets still require loopback.
The Hive guard also applies to its hostnames supplied through `record public`.
Expand Down Expand Up @@ -169,6 +172,11 @@ Private `camera-audit.jsonl` observations include frame time, world clocks, play

Private `held-item-light-audit.jsonl` observations record actual first-person submissions. They include packed light, quad normals, tint layers, material emission, and the selected pipeline. Observations do not change the item or camera. Compare them with the screenshot timestamp; startup light values can change while chunks load.

Private `movement-audit.jsonl` observations record position, velocity, item use, held item, and selected hotbar slot at each observed movement phase.
The `epochMillis` timestamp aligns those observations with external input markers.
Use the item and slot fields to distinguish a changed selection from a missing movement impulse.
Check the packet journal for the actual teleport, correction, and motion commands before judging a combined-mechanics trial.

The native Hive recording sends `SetTime` 12445, then `GameRulesChanged` with `dodaylightcycle=false`. Java previously stored that rule without updating its running clock rate. The clock patch now sends the pause to Java. This fixes the lobby's drift into night. Legacy `SetTime` still advances while daylight is enabled.

Use `--client proxy --transport-only` to check the separate Java → ViaProxy route. An accepted converted server pack carries versioned Bedrock rendering metadata. The add-on uses this metadata to activate the native lightmap and disable Java's low-light vignette on the proxy route. Local packs and unsupported metadata cannot activate this context. Resource reload and disconnect clear it. Stale reload completion cannot restore it.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 041c5023c3ff55f037122573e94cfafcddf932c9 Mon Sep 17 00:00:00 2001
From 3efc13f7266e1826ee69977f548a28bd4711d68e Mon Sep 17 00:00:00 2001
From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com>
Date: Sun, 18 Oct 2026 16:55:37 +0200
Subject: [PATCH] feat(entity-events): translate Bedrock actor events to Java
Expand Down Expand Up @@ -327,18 +327,18 @@ index b47f5471..88ce252d 100644
levelSoundEvent.send(BedrockProtocol.class, false);
}
diff --git a/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java b/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java
index fd0640c4..ddb84e53 100644
index 4578a73f..7bb6b8f8 100644
--- a/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java
+++ b/src/main/java/net/raphimc/viabedrock/protocol/packet/EntityPackets.java
@@ -39,6 +39,7 @@ import net.raphimc.viabedrock.api.model.NativeActorMessage;
@@ -40,6 +40,7 @@ import net.raphimc.viabedrock.api.model.NativeActorMessage;
import net.raphimc.viabedrock.api.model.ActorMotionCommand;
import net.raphimc.viabedrock.api.model.MovementCorrectionTiming;
import net.raphimc.viabedrock.api.model.NativeAnimationMessage;
+import net.raphimc.viabedrock.api.model.NativeFishingEvent;
import net.raphimc.viabedrock.api.model.entity.ClientPlayerEntity;
import net.raphimc.viabedrock.api.model.entity.CustomEntity;
import net.raphimc.viabedrock.api.model.entity.Entity;
@@ -50,10 +51,12 @@ import net.raphimc.viabedrock.api.util.RegistryUtil;
@@ -51,10 +52,12 @@ import net.raphimc.viabedrock.api.util.RegistryUtil;
import net.raphimc.viabedrock.api.util.TextUtil;
import net.raphimc.viabedrock.protocol.BedrockProtocol;
import net.raphimc.viabedrock.protocol.ClientboundBedrockPackets;
Expand All @@ -351,7 +351,7 @@ index fd0640c4..ddb84e53 100644
import net.raphimc.viabedrock.protocol.data.enums.java.Relative;
import net.raphimc.viabedrock.protocol.data.enums.java.generated.EquipmentSlot;
import net.raphimc.viabedrock.protocol.data.generated.java.EntityDataFields;
@@ -62,6 +65,9 @@ import net.raphimc.viabedrock.protocol.model.*;
@@ -63,6 +66,9 @@ import net.raphimc.viabedrock.protocol.model.*;
import net.raphimc.viabedrock.protocol.rewriter.EntityMetadataRewriter;
import net.raphimc.viabedrock.protocol.rewriter.ItemRewriter;
import net.raphimc.viabedrock.protocol.storage.EntityPropertyTracker;
Expand All @@ -361,16 +361,16 @@ index fd0640c4..ddb84e53 100644
import net.raphimc.viabedrock.protocol.storage.ChannelStorage;
import net.raphimc.viabedrock.protocol.storage.EntityTracker;
import net.raphimc.viabedrock.protocol.storage.PlayerPredictionStorage;
@@ -72,6 +78,7 @@ import net.raphimc.viabedrock.protocol.types.BedrockTypes;
@@ -73,6 +79,7 @@ import net.raphimc.viabedrock.protocol.types.BedrockTypes;

import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
import java.util.logging.Level;

public final class EntityPackets {
@@ -500,6 +507,43 @@ public final class EntityPackets {
return;
@@ -509,6 +516,43 @@ public final class EntityPackets {
hurt.send(BedrockProtocol.class);
}
switch (event) {
+ case FISHHOOK_FISHPOS, FISHHOOK_HOOKTIME, FISHHOOK_TEASE -> {
Expand Down Expand Up @@ -413,7 +413,7 @@ index fd0640c4..ddb84e53 100644
case HURT -> {
final CompoundTag damageTypeRegistry = gameSession.getJavaRegistries().getCompoundTag(RegistryKeys.DAMAGE_TYPE);
final SharedTypes_Legacy_ActorDamageCause damageCause = SharedTypes_Legacy_ActorDamageCause.getByValue(data, SharedTypes_Legacy_ActorDamageCause.Override);
@@ -529,12 +573,17 @@ public final class EntityPackets {
@@ -538,12 +582,17 @@ public final class EntityPackets {
}
if (entity != entityTracker.getClientPlayer()) {
entity.playSound("death");
Expand All @@ -434,7 +434,7 @@ index fd0640c4..ddb84e53 100644
}
}
});
@@ -777,6 +826,34 @@ public final class EntityPackets {
@@ -791,6 +840,34 @@ public final class EntityPackets {
return entity;
}

Expand Down
Loading
Loading