Files
RustNotMC/docs/collision-geometry.md
SashegDev 874b6f20c2 Клиент: начальный импорт кодовой базы
Основа — Horizon (MIT). История апстрима не переносится: этот репозиторий ведёт свою.
2026-10-29 22:04:28 +03:00

2110 lines
130 KiB
Markdown

# Horizon collision geometry
The version target is Minecraft Java Edition **26.3**. Geometry is a simulation
foundation; Horizon has a native client for inspecting a controlled block scene.
Live gameplay and entity simulation remain unfinished.
`horizon-core::geometry` provides `Vec3`, `Aabb`, `Axis`, `Direction`, `BlockHit`,
and immutable `VoxelShape` values. Coordinates are doubles. Arithmetic keeps
vanilla's operation order, signed zero, NaN comparisons, normalization threshold,
and collision epsilon. It does not enable approximate or fused simulation math.
Implemented vector operations include addition/subtraction, vector-to, component
products, scaling, normalization, dot/cross products, interpolation, projection,
distance/length, horizontal vectors and finite/equality checks. Rotations, look
directions, alignment, axis replacement, direction offsets, and pitch/yaw extraction
are also implemented. The full Vec3 API and entity integration remain absent.
Trig uses vanilla's 65,536-entry float sine table with double angle scaling and
Java long narrowing. The table is generated from the pinned formula in Rust;
the geometry suite compares every generated entry against the runtime table.
Inverse trig narrows to float at vanilla's conversion points. These comparisons
validate the tested platform; other platforms need the same bit comparisons.
Bounding boxes normalize endpoints with Java-compatible min/max. Queries include
half-open containment, strict intersection, transforms, distances, ray clipping,
block-coordinate construction with wrapping integer endpoints, setters, next-value
deflation, and swept-box collision tests. A disjoint `intersect` preserves vanilla's
constructor normalization rather than introducing a different empty-box rule.
Shapes keep exact coordinate arrays and a packed occupancy grid. Greedy boxes are
cached once in vanilla order. Collision-distance queries use occupied grid cells;
ray and closest-point queries reuse the cached boxes. Column minima/maxima use
vanilla's cyclic perpendicular coordinates and infinity for empty/outside cells.
Cube shapes retain arithmetic
lookup; moved shapes use array lookup even for a zero offset. Ray hits preserve
face tie ordering, endpoint exclusion, tolerances, and the 0.001 inside-hit nudge.
Boolean shape joins and overlap predicates preserve cube, identical,
disjoint and epsilon-merger behavior. Shape operations reject truth tables that
fill two empty cells, as vanilla does. Per-axis cube-coordinate metadata survives
partial merges and is checked when importing cached shapes. Box construction
preserves thin-box rejection and up to 1/8 cube quantization. Optimized joins
reconstruct greedy boxes in vanilla order. Face extraction is implemented; edge extraction and shape rotations remain absent.
Discrete axis extrema are retained separately from occupied cells. A box can
quantize to no occupied cells while retaining a finite minimum/maximum on other
axes. That state affects vanilla's lower-block floor-height lookup. Empty joins
also preserve their integer sentinel extrema; optimization and moving an empty
shape return the canonical empty shape.
Shape clones preserve identity and share immutable coordinate, occupancy and box
storage. New shapes keep separate identities even when their grids are equal.
This preserves alias-sensitive join shortcuts and avoids copying large grids
when an operation returns an existing shape. The cache importer shares equal
grid storage while retaining the distinct vanilla shape identities.
`resolve_shape_movement` ports vanilla's movement resolver over a supplied shape
list: Y first, then horizontal axes in movement-magnitude order, translating the
box by resolved motion before each axis query. `candidate_step_heights` preserves
float narrowing, duplicate identity, current-Y exclusion, and sorted candidate
heights. `resolve_step_movement` adds the initial collision and step-up decision,
including landing-height adjustment, a second collider query, and the first
candidate improving horizontal movement. `entity_collision_bounds` preserves
the initial entity query bounds. These helpers take caller-selected colliders;
they do not choose world/entity shapes, set grounding, change velocity, or apply
inside-block effects.
The step-up corpus calls the actual private `Entity.collide` method for **17,680
cases** per JAR. Reference fixtures supply entity inputs and controlled
block/entity/border shape lists; vanilla performs the movement decisions. Query
bounds and results are compared bit for bit. This verifies the decision with
those inputs, not live world selection or entity state transitions.
`block_floor_height` returns the selected shape's maximum Y, or lazily queries
the lower shape only when the current one is empty. Its 12,000-case corpus also
checks the lower supplier's invocation count against `BlockGetter`.
`traverse_blocks` visits blocks in vanilla ray order, including its endpoint nudge,
strict corner comparisons, early callback return, integer wrap and signed-zero
endpoint equality. It accepts finite rays and an explicit visit budget. Invalid
geometry or exceeding that budget returns a typed error; earlier callbacks remain
applied. Actual block/fluid ray selection is a separate integration task.
Inclusive block-box iterators preserve X/Y/Z order, while directional iterators
preserve vanilla's movement-dependent axis order and corner signs. AABB iteration
includes floored maximum faces. They return independent position values and
reject true volumes above the positive Java-int domain, instead of reproducing
overflowed Java iteration counts.
`sweep_intersected_blocks` ports movement-path visits from
`BlockGetter.forEachBlockIntersectedBetween`: tiny movement, the initial box,
ray-clipped footprints, packed-position deduplication, final box, step indices,
and early callback stops. Stationary/tiny movement avoids a deduplication-set
allocation. Inputs and computed geometry must be finite; a caller-selected work
budget counts ray steps and iterator candidates, including suppressed duplicates.
Earlier callbacks are not rolled back on an error. Block effects still need
their own implementations and integration with entity movement.
`horizon-world::collision::CachedCollisionRegistry` imports a private local export
of vanilla cache data. The export includes DataVersion, all state descriptors,
deduplicated shapes, coordinate-kind metadata, discrete extrema, and a per-state
cache index. Import verifies every state ID
against the block registry. Section lookup also requires the same borrowed registry.
Imported nonempty extrema must agree with occupancy; empty extrema must be in
the grid's domain or match vanilla's empty-join sentinel triple. Extrema form part
of the grid-sharing key, so equal occupancy does not erase different metadata.
There is no fallback shape for an unsupported state: `None` means block behavior
must select it, while a cached empty shape is a valid `Some` value.
This covers the cached branch of the **no-context** `BlockState.getCollisionShape`
method. Vanilla's overload taking `CollisionContext` always calls block behavior;
the cache cannot establish entity collision parity. Dynamic and ordinary entity-context selection are implemented as described below.
Experimental minecart contexts, world borders, movement integration, fluid
simulation, block effects and live collision broad-phase queries remain pending.
Run the comparisons after preparing the pinned artifacts:
```sh
python3 tools/test_geometry_parity.py
python3 tools/test_collision_parity.py
```
Both suites invoke actual vanilla methods from the authenticated client and server
JARs. They compare canonical double bits, including infinities/NaNs, rather than
using a numerical tolerance. The geometry corpus includes empty and sparse grids,
greedy decomposition, overlapping boxes, rays, tiny movements and IEEE boundaries.
It compares **1,320,187 output lines per JAR**, including **2,400 integer-box
iterator cases**, **2,400 AABB iterator cases**, and **9,022 movement-path traces**.
The registry suite exercises cached shape queries through resident section IDs,
translation at negative and world-border coordinates, and invalid import rejection.
Its export records **35,524 cached states**, **199 uncached states**, **6,093
shape identities**, and **330 distinct grids**. The comparison runs **213,144 queries** plus state/box/identity checks,
producing **1,097,456 matching output lines per JAR**. These counts describe this
branch and corpus; they are not a gameplay coverage percentage.
Raw grids admit at most 1,048,576 cells with strictly increasing, non-NaN
coordinates. Oversized or malformed imports/joins return typed errors. This
bounded library API does not reproduce Java's complete exception/object surface.
All exported data, test inputs, reference output, and compiled adapters remain
under gitignored `.local/`. Success reports record exact sources, inputs, outputs,
and reference hashes. A runner removes its prior success report before running
and rejects edits to the captured sources during validation. Passing these suites
does not prove whole-game parity or any FPS/render-distance improvement.
Checked-in [geometry metadata](../benchmarks/rust-geometry-2026-10-05/scoped-parity.json)
and [cached-collision metadata](../benchmarks/rust-collision-2026-10-05/scoped-parity.json)
identify their tested source versions. Reports cover their recorded snapshots;
later changes require fresh validation.
Entity obstruction now evaluates ordered candidate snapshots, excluded entity
identity, spectator/removal/building flags, shared root-vehicle identity and
voxel-shape intersection. Empty shapes skip the query; candidate collection
finishes before obstruction evaluation. Unit-block queries translate in floating
point, including integer-coordinate boundaries. Run
`python3 tools/test_entity_obstruction_parity.py` to compare against the actual
vanilla `EntityGetter` default methods and entity metadata queries.
The [entity-obstruction report](../benchmarks/rust-entity-obstruction-2026-10-06/scoped-parity.json)
records **15,121 matching output lines per JAR** over composite shapes, boundary
contacts, thin boxes, metadata filters, vehicle roots and injected query failures.
The Java fixture privately allocates entity snapshots without running their
constructors. Entity lifecycle, spatial indexing and vehicle-tree maintenance
remain separate implementation work. Workspace tests, warning-free Clippy and
**138 Python tests** passed at this snapshot.
Legacy block solidity now uses explicit definition overrides and cached collision
bounds, with force-on precedence and native mean-size/height thresholds. The
no-context replaceable and liquid flags are kept independently. Solid rendering
uses the occlusion definition flag and a full-shape test over imported raw
occlusion geometry. Import validates the pinned
DataVersion, full state identities and complete block definitions before building
a shared property table. Predicates query this table in constant time.
`python3 tools/test_block_properties_parity.py` compares all **35,723 states** and
**18,096 synthetic cache/flag/shape cases**, including adjacent floating-point values
around solidity thresholds and both occlusion flag values. The [block-properties report](../benchmarks/rust-block-properties-2026-10-06/scoped-parity.json)
records **197,180 matching lines per JAR**. Definition flags, collision and raw
occlusion data are private runtime inputs; Rust calculates solidity and solid
rendering and caches full-face occlusion masks. Every state and synthetic shape
is compared on all six faces; source and fixture hashes are recorded.
Item/fluid-context replacement and collision with live entities remain separate work.
Face selection now preserves native cube-axis shortcuts, epsilon sample points,
slice coordinates and clamped parent extrema, including sparse slices whose
native bounds differ from occupied boxes. Repeated queries share face identities.
The FULL, CENTER and RIGID support tests execute against the selected shape.
`python3 tools/test_face_support_parity.py` compares **1,615 input shapes** and
nested faces, producing **595,686 matching lines per JAR** in the
[face-support report](../benchmarks/rust-face-support-2026-10-06/scoped-parity.json).
The [refreshed geometry report](../benchmarks/rust-geometry-2026-10-06/scoped-parity.json)
also retains **1,320,187 matching lines per JAR** after face slicing was added.
Block-specific support-shape selection is a separate layer.
Registered support caches now derive FULL/CENTER/RIGID masks from privately
imported support geometry and share results by shape identity. The importer
checks the data kind and full state identities. `None` explicitly requests
uncached behavior; it never becomes an assumed unsupported face.
`python3 tools/test_block_support_parity.py` compares **35,524 cached states**
across six directions and three support kinds, while retaining **199 uncached
states**. The [cached-support report](../benchmarks/rust-block-support-2026-10-06/scoped-parity.json)
records **248,867 matching lines per JAR**.
Face-cache storage is now lazy and attached to shape identity. Clones share it;
new identities and moved shapes start with an empty cache. A regression test
checks that cached faces do not retain their parent after it is dropped. The
face and geometry differential suites passed again after this allocation change,
as did workspace tests, Clippy and **140 Python tests**. No FPS claim is inferred
from these library checks.
Dynamic support selection now handles bamboo collision offsets, dripstone and
sulfur-spike thickness/direction, the empty-context scaffolding support shape,
powder snow, and shulker animation-state support faces. Moving-piston lookup
preserves missing/wrong block-entity behavior and delegates active entity shape
calculation to the world. The [dynamic-support report](../benchmarks/rust-dynamic-support-2026-10-06/scoped-parity.json)
records **4,867,780 matching lines per JAR** over **107,308 fixtures** covering all
**199 uncached states**, coordinate boundaries, block-entity snapshots and query
failures. Run `python3 tools/test_dynamic_support_parity.py` to reproduce it.
The current suite also compares no-entity-context collision geometry in **60,161
fixtures**, including **13,014 shulker progress fixtures**. Shulker collision
bounds retain native float interpolation and differ from animation-state support
faces. `BlockCollisionRegistry` dispatches cached and dynamic collision queries;
entity movement contexts and block-entity lifecycle remain separate work.
Workspace tests, warning-free Clippy and seven focused Python tests passed.
Moving-piston collision now selects stationary extended bases and moving heads,
translates shapes using native float progress arithmetic, and honors the
movement-direction collision exclusion. Interpolation preserves float operation
order, including negative partial ticks and IEEE edge cases. The separate
collision-related state used for entity pushing retains its own sticky/head
rules; entity pushing itself is not implemented by this module.
`python3 tools/test_piston_shape_parity.py` compares **102,315 fixtures**,
including every registered moved state and **10,000 raw float interpolation
cases**. The [piston-shape report](../benchmarks/rust-piston-shape-2026-10-06/scoped-parity.json)
records **1,096,811 matching lines per JAR**. This corpus uses absent block
entities for moved-block collision selection. Workspace tests, warning-free
Clippy and **142 Python tests** passed. Tick progression and live world mutation
remain separate work.
The refreshed dynamic-support corpus also includes **9,216 active piston
snapshots**, composing block-entity lookup with piston collision generation and
all support tests. It compares extension/retraction, source heads, progress
boundaries, collision exclusions and query failures. These snapshots do not
exercise piston ticks, pushed entities or chunk updates.
The archived block-survival snapshot executes 51 rule kinds with 63 distinct rule/tag
bindings over registry-bound solid flags, air identity, support tags and
FULL/CENTER/RIGID geometry and empty-context collision. The verified snapshot covers
**all 1,286 pinned block definitions and 35,723 states**. Candidate
properties select attachment direction, hanging state, door/plant halves and
pale moss carpet's serialized `bottom` property. Pressure plates and cactus
flowers preserve repeated neighbor reads. Downward center support applies the
unstable-bottom-center tag only where native helpers do. Upper doors require the
same block below; upper double plants also require its lower half. Crop survival
checks brightness against 8 before querying support; farmland preserves its
conditional second read above, and dripleaf stems read both neighbors. Sugar cane,
lily pads, frogspawn, spore blossoms, small dripleaves and tall seagrass preserve
their independent fluid queries, source/full-water requirements and tag checks.
Growing plants preserve head/body identity and kelp support restrictions.
Scaffolding recomputes neighbor distance in native order; chorus plants and flowers
preserve branching reads and early exits. Piston heads validate base type, facing
and extension. Mangrove propagules, speleothems, pitcher crops, bells and shelf
mushrooms use their version-specific attachment rules. Multiface blocks, vines,
hanging moss, snow layers and sea pickles preserve support/collision query order.
Fire uses imported ignition odds and waterlogging; cactus checks horizontal solids
and lava before its support and upper liquid state. Paths recognize fence gates,
and mushrooms preserve the light-override tag and solid-render requirement.
Interrupted runs can be resumed with `python3 tools/test_block_survival_parity.py --resume`.
The runner verifies source, environment, fixture and compiled-artifact hashes
before reusing completed stages. A changed output is regenerated; changed inputs
require a fresh run without `--resume`. Checkpoints stay under `.local`, and
a parity report is written only after both native comparisons pass.
`python3 tools/test_block_survival_parity.py` compares actual native `canSurvive`
calls in both pinned JARs. The [block-survival report](../benchmarks/rust-block-survival-2026-10-06/scoped-parity.json)
records **35,998,488 matching output lines per JAR** across **9,229,463 fixtures**.
Each supported candidate state is exercised; behavior representatives are tested
against every neighbor state, changing repeated reads, integer-coordinate
wrapping, absent/closed/open shulker snapshots and injected block/entity query
failures, plus light thresholds, independent fluid sequences and fluid-query
failures. Native method ownership
and support-tag fields supply private
definition metadata; survival results are calculated in Rust. Workspace tests,
Clippy and the **147-test Python suite** passed. This establishes the recorded
survival scope; full placement, neighbor updates, scheduled behavior and complete
block gameplay remain pending.
Collision contexts now preserve empty-context fallback heights, position-only
queries, and captured entity position, descending, main-hand and placement flags.
Height comparisons retain the native float epsilon widened to double. Null
placement factories use `-Double.MAX_VALUE`; `withPosition` sets the placement
flag and ignores the supplied height when the entity is absent. Empty item stacks
match AIR in entity/empty contexts, while position-only contexts never report a
held item. Living-entity fluid callbacks run before the same-family exclusion,
with the second fluid as their argument, and propagate failures.
`python3 tools/test_collision_context_parity.py` exercises actual native factories
and queries over **8,338 context snapshots**, comparing **225,126 output lines per
JAR**. The [context report](../benchmarks/rust-collision-context-2026-10-06/scoped-parity.json)
records the pinned artifacts and exact source/input/output hashes. The corpus
includes adjacent representable values around height thresholds, empty shapes,
integer-coordinate extremes, NaN/infinity, null entities, item count boundaries,
all five fluid types and callback failures. Native entity and stack snapshots are
allocated privately without their constructors; this checks query behavior, not
entity construction or inventory lifecycle. Inventory changes after context
capture, experimental minecart contexts and live movement integration remain
pending. Contextual block-shape selection is being added separately.
`ScaffoldingCollision` now selects stable scaffold geometry, the unstable bottom
platform, or an empty shape using the collision context. Placement contexts are
always empty. Descending affects the top surface check; the bottom platform also
requires nonzero support distance, the bottom flag and the lower height check.
No-context support and contextual collision share the same immutable stable shape.
`python3 tools/test_scaffolding_collision_parity.py` compares all **32 states**
across **56,448 fixtures**, producing **524,300 matching lines per JAR** in the
[scaffolding report](../benchmarks/rust-scaffolding-collision-2026-10-06/scoped-parity.json).
The native context dispatch executes against a world proxy that rejects all
queries. Full shape coordinates, bounds, ordered boxes and cube metadata match
for empty, position, entity and placement contexts, including adjacent doubles
at both height thresholds. Block placement, distance updates, collapse and live
entity motion through scaffolding are separate work.
`LiquidCollision` implements contextual water/lava collision selection. The
always-fluid flag returns a full cube before querying entities or neighbors.
Otherwise, flowing block levels and nonliving contexts return empty. Source
blocks request the living entity's standing shape, check its height, then read the
fluid above and invoke the entity's standing predicate. Empty candidate shapes
still follow those query rules. Above-block coordinates wrap as Java integers.
`python3 tools/test_liquid_collision_parity.py` compares all **32 water/lava block
states**, all **33 possible above-block liquid/empty states**, full selected shape
data and ordered callback traces, including failures at each query. The
[liquid-collision report](../benchmarks/rust-liquid-collision-2026-10-06/scoped-parity.json)
records **571,179 matching lines per JAR**. Standing shapes and fluid abilities are
controlled inputs in this suite; each entity type still needs its implementation.
Fluid spreading, swimming, drowning and live movement remain pending.
Powder snow now selects the native `0.9f`-high falling shape when fall distance
exceeds 2.5, a full cube for falling-block entities, and a full cube for entities
that can walk on it, are above it and are not descending. Placement and absent
entity contexts are empty. Walkability checks the entity-type tag first, then
leather boots only for living entities; successful tags skip equipment queries.
The API takes current entity metadata and lazy tag/equipment providers.
`python3 tools/test_powder_snow_collision_parity.py` compares **63,336 fixtures**
and **599,180 matching lines per JAR** in the
[powder-snow report](../benchmarks/rust-powder-snow-collision-2026-10-06/scoped-parity.json).
The native block method and walkability predicate execute over controlled entity
snapshots. The corpus covers fall-distance and top-height boundaries, nonfinite
values, falling-block instances, item counts, query failures and skipped queries.
Entity tag loading, freezing, sinking and live movement remain separate work.
`BlockCollisionRegistry::collision_shape_with_context` now combines the contextual
scaffolding, liquid and powder-snow rules with the existing cached/dynamic paths.
It dispatches these overrides before consulting cached geometry. The pinned
native audit checks **35,492 context-independent cached states** at seven positions
with both interface and entity contexts that reject every query: each returns the
identical cache object without world reads. The **32 cached liquid states** query
the context and take their separate behavior path. The **199 uncached states**
continue through explicit behavior implementations.
`python3 tools/test_contextual_collision_parity.py` validates integrated dispatch
for all **35,723 states**, **11 contexts** and both fluid-flag inputs:
**785,906 fixtures** and **2,391,334 matching output lines per JAR** in the
[contextual-registry report](../benchmarks/rust-contextual-collision-2026-10-06/scoped-parity.json).
Outputs compare cache-relative shape equality or full uncached geometry, plus
ordered world/entity callbacks. This integration corpus supplies missing block
entities; active shulker and piston snapshots retain their separate suites.
These checks establish the recorded collision-query scope, not entity movement
or whole-game parity.
Private shape exports now carry explicit canonical-identity markers. The importer
restores the global empty/full-block shapes only when their complete grid metadata
matches, and rejects duplicate or malformed canonical claims. Equal unmarked
shapes keep distinct identities. Older exports remain readable and report
`has_canonical_identities() == false`; they cannot establish the canonical identity
needed by vanilla's block-collision iterator fast path.
The [canonical-identity report](../benchmarks/rust-canonical-collision-2026-10-06/scoped-parity.json)
adds identity checks for every cached state: **5,566 canonical empty**, **3,348
canonical full-block** and **26,610 other cached states**, with **1,132,980 matching
output lines per JAR**. The integrated contextual comparison also passes again
with **2,391,334 lines per JAR** in its
[regression report](../benchmarks/rust-canonical-collision-2026-10-06/contextual-regression.json).
Five import tests cover legacy data, equal-but-distinct grids, canonical restoration
and malformed identity metadata. Workspace Clippy passes without warnings.
`BlockCollisionScan` now implements lazy cursor selection around entity bounds.
It retains the native epsilon-expanded cursor, X/Y/Z visit order, skipped corners,
large-shape face filtering, moving-piston edge filtering and suffocation-before-
shape query order. Only successful chunk lookups are reused; absent chunks are
queried again. Shape selection uses the global collision world, while suffocation
uses the selected chunk. Canonical full blocks use native AABB intersection;
other shapes use moved voxel intersection. Returned positions are independent
values. Providers supply current block metadata and contextual shape selection.
`python3 tools/test_block_collision_scan_parity.py` compares **4,176 fixtures**
and **517,820 matching lines per JAR** in the
[collision-scan report](../benchmarks/rust-block-collision-scan-2026-10-06/scoped-parity.json).
The native iterator runs over controlled metadata, shapes and chunk availability;
traces cover early termination, missing chunks, query failures, thin/zero-width
bounds, integer-coordinate wrapping and equal shapes with different canonical
identities. Two Rust API tests cover finite/bounded input requirements, cursor
visit budgets and termination after errors. Unsupported cursor volumes return
errors; Java's overflowing iteration counts are outside this bounded API.
Registry/world integration and live movement still need implementation.
`BlockCollisionRegistry` now prepares native cursor-filter flags for every state:
uncached shapes are large, while cached shapes are large when any axis extends
outside the unit block. Moving-piston identity is bound to the same registry.
`SuffocationRegistry` binds the native predicate definitions and resolved
`causes_suffocation` tag. Default predicates combine tag membership with full
collision geometry; overrides preserve piston extension, constant predicates and
lazy shulker block-entity checks. Missing or wrong-type shulker block entities
count as suffocating. Tag changes require rebinding the suffocation registry.
`python3 tools/test_suffocation_parity.py` checks all **35,723 states** with natural,
empty and all-block tag bindings at four positions, including integer extremes.
Every shulker state also covers absent/wrong block entities, all animation states
and query failures. The [suffocation report](../benchmarks/rust-suffocation-2026-10-06/scoped-parity.json)
records **1,697,193 matching lines per JAR**, including scan flags and query traces.
These are registry predicates; live collision-world binding, movement and
suffocation damage remain separate integration work.
The [contextual regression](../benchmarks/rust-suffocation-2026-10-06/contextual-regression.json)
also passes again with **2,391,334 lines per JAR**, and its all-state native audit
now compares large-shape and moving-piston flags. Workspace Clippy passes.
`RegistryCollisionWorld` now binds `BlockCollisionScan` directly to registered
metadata, contextual shapes and suffocation rules. Chunk providers return current
state IDs and a chunk-local block-entity provider; contextual collision uses the
global world. Construction rejects legacy collision exports without complete
canonical identity metadata, because their unit-block fast paths can differ.
`python3 tools/test_registry_collision_scan_parity.py` compares native
`BlockCollisions` over resident `ProtoChunk` sections with the Rust binding over
`TerrainChunk` sections. All registered states cover ordinary and suffocating-only
selection. Additional scenes cover partial/dynamic blocks, chunk and build-height
boundaries, missing chunks, replacements, early termination and query failures.
Shulker fixtures deliberately give the chunk and global providers different
entities to check routing. The [resident collision report](../benchmarks/rust-resident-collision-scan-2026-10-06/scoped-parity.json)
records **3,046,929 matching output lines per JAR**. Six collision import/binding
tests pass, including legacy-metadata rejection; workspace Clippy passes.
Live chunk loading, entity lifecycle, movement and the playable client remain
separate integration work.
`resolve_world_movement` now joins registry-backed block scanning to the native
step-up decision. It selects entity colliders once, including for zero/underflow
movement, then collects applicable border and block shapes in native order for
the initial and optional step query. `try_resolve_step_movement` accepts owned or
borrowed collider lists and propagates provider failures without returning a
partial displacement. The shared implementation avoids allocating reference
lists for owned shapes; existing borrowed callers retain the same API.
`python3 tools/test_world_movement_parity.py` runs actual `Entity.collide` over
registered blocks and resident Java sections, comparing the Rust world collector
and step solver. Every registered state appears as an obstacle; additional cases
cover step heights, grounded/falling motion, ceilings, partial/dynamic blocks,
chunk boundaries, zero/underflow motion and failures during collection. The
[world movement report](../benchmarks/rust-world-movement-2026-10-07/scoped-parity.json)
records **7,062,798 matching lines per JAR**. Entity collider lists, border
proximity/shapes and collision contexts are controlled fixture inputs. Actual
entity selection, border state, travel/gravity/velocity, grounded side effects
and playable integration remain pending.
The [geometry regression](../benchmarks/rust-world-movement-2026-10-07/geometry-regression.json)
passes again with **1,320,187 lines per JAR**, including the existing native step
fixtures. All six movement unit tests and workspace Clippy pass. New tests cover
owned-query failures during both initial and step collection and signed zero
preservation when collection is skipped.
`entity_collision_shapes` now implements `EntityGetter.getEntityCollisions`
selection over ordered entity snapshots: average-size short circuit, epsilon
inflation, exact bounds/excluded-identity filtering, spectator suppression and
lazy collision-policy callbacks. With a source entity it invokes that entity's
`canCollideWith`; without one it invokes each candidate's
`canBeCollidedWith(null)`. Selected bounds become shapes after policy evaluation.
Providers retain responsibility for live storage and each entity type's policy.
`python3 tools/test_entity_collision_parity.py` compares the actual native getter,
default vehicle-root checks and controlled policy overrides, including failures
at query/callback boundaries. Tiny/zero-width and nonfinite query boxes, inflated
boundary contacts, spectators, shared vehicles, null sources and ordered shape
outputs are covered. The [entity collision report](../benchmarks/rust-entity-collision-2026-10-07/scoped-parity.json)
records **158,558 matching lines per JAR**. Workspace Clippy passes. This adds the
selection helper needed by movement; live entity indexing, lifecycle and
entity-type policy implementations remain pending.
`BorderGeometry` now models stationary and moving world-border extents, cached
stationary collision geometry, center/absolute-limit changes, tick progression,
partial-tick bounds and movement proximity. The pinned version decrements size
transition progress once per tick. Ordinary bounds and collision shapes use the
previous size while moving; completing the transition installs a stationary
extent at the target. Collision geometry subtracts the floor/ceil-rounded inner
column from the infinite outer shape. Boundary predicates retain their asymmetric
inclusive minimum/exclusive maximum tests and native floating-point order.
`python3 tools/test_world_border_parity.py` compares actual `WorldBorder` mutation
sequences, extent metadata, complete shape geometry and proximity predicates.
The [border report](../benchmarks/rust-world-border-2026-10-07/scoped-parity.json)
records **1,138,830 matching lines per JAR**, including zero/large durations,
wrapping start timestamps, completion, retargeting, signed zero, extreme finite
centers/sizes and nonfinite query/interpolation inputs. The supported construction
and mutation domain requires finite nonnegative sizes, finite centers and
nonnegative absolute limits/durations. A unit test verifies invalid parameters
leave the existing extent unchanged; workspace Clippy passes. Saved-data codecs,
listeners, dirty-state events, damage, synchronization and live movement binding
remain separate work.
`restitute_movement` now implements the pinned post-collision velocity calculation
with lazy entity/block bounce queries, gravity thresholds, nonliving float
scaling and air-drag interpolation. It preserves horizontal/vertical collision
branches, callback ordering, the position-sync field write and final velocity
assignment. Errors retain already performed effects instead of rolling back the
world or returning a fabricated successful velocity.
`python3 tools/test_restitution_parity.py` executes actual
`Entity.restituteMovementAfterCollisions` on living and nonliving snapshots with
controlled block restitution and suppression tags. The
[restitution report](../benchmarks/rust-restitution-2026-10-07/scoped-parity.json)
records **177,090 matching lines per JAR**. Fixtures cover changing lazy getter
values, signed zero/nonfinite arithmetic, bounce callbacks that alter velocity,
and failures before/after each side effect. Workspace Clippy passes. Registered
block property/tag provisioning, actual bounce sounds/events, `Entity.move`
guards, fall damage, grounding and full player simulation remain pending.
`find_supporting_block` now selects the nearest colliding block center using the
native distance arithmetic and wrapping Y/Z/X position tie-break. `GroundState`
implements the thin foot query, previous-horizontal-footprint fallback and both
ground/collision flag updates. Null movement preserves the prior support in the
native branch where no fallback query can run; query failures retain preceding
flag writes.
`python3 tools/test_ground_support_parity.py` compares actual
`CollisionGetter.findSupportingBlock`, `Entity.checkSupportingBlock` and both
`setOnGroundWithMovement` overloads. The
[ground support report](../benchmarks/rust-ground-support-2026-10-07/scoped-parity.json)
records **342,709 selection lines and 151,444 state-transition lines per JAR**,
covering ties, nonfinite entity positions, missing chunks, query errors, nullable
movement and sequential changes of support. Shape/context snapshots are controlled;
registry-backed scanning has separate integration coverage. Workspace Clippy
passes. Full live entity movement, support-dependent effects and gameplay remain
pending.
The [shared scanner regression](../benchmarks/rust-ground-support-2026-10-07/scan-regression.json)
also passes with **517,820 matching lines per JAR** after extending its fixtures.
`movement_support` now implements support-dependent positions, the three public
offset variants and base-entity block jump/speed factors. It preserves the support
X/Z coordinates, conditional fence/wall/gate lookup, float-to-double offset
widening, cached entity block position and lazy block queries. Jump-factor lookup
always reads the lower block; speed lookup can short-circuit for water, bubble
columns or a non-unit current factor.
`python3 tools/test_movement_support_parity.py` compares the actual native methods
with controlled state/tag/property snapshots. The
[movement support report](../benchmarks/rust-movement-support-2026-10-07/scoped-parity.json)
records **51,572 matching lines per JAR**, including float boundaries, nonfinite
positions/offsets/factors, tag/type short circuits and errors at every query.
Workspace Clippy passes. Registered movement-property provisioning, living-entity
efficiency and the full movement lifecycle remain pending.
`MovementProperties` imports version-bound raw friction, speed, jump, bounce and
fall-distance-reduction fields plus fence-gate type. `BoundMovementProperties`
binds resolved fence/wall/bounce-suppression tags; rebinding leaves previous
snapshots unchanged. `RegistryMovementWorld` connects real state IDs from a block
provider to the support-position and factor calculations, rejecting unknown IDs.
`python3 tools/test_movement_registry_parity.py` independently checks native
property getters for every state, then runs actual entity support/factor queries
over all **35,723 states / 1,286 blocks** under normal, empty and universal tags.
Mixed-block scenes and failing providers check query order. The
[registered movement report](../benchmarks/rust-movement-registry-2026-10-07/scoped-parity.json)
records **2,300,888 matching lines per JAR**. Three import/binding tests and
workspace Clippy pass. This provisions movement data; full player travel, live
entity state and block bounce effects remain separate integration work.
`PistonMovement` now accumulates displacement per axis and resets it when the
game tick changes. It preserves the initial squared-length short circuit, lazy
time lookup, first nonzero axis, the +/-0.51 cumulative clamp and float-derived
small-displacement threshold. A failed time lookup leaves the accumulator intact.
`python3 tools/test_piston_movement_parity.py` runs actual
`Entity.limitPistonMovement` across sequential tick/push inputs. The
[piston movement report](../benchmarks/rust-piston-movement-2026-10-07/scoped-parity.json)
records **325,197 matching lines per JAR**, including repeated/opposing pushes,
threshold neighbors, signed zero, nonfinite inputs and injected failures.
Workspace Clippy passes. Piston block events, entity pushing and the surrounding
`Entity.move` lifecycle remain pending.
The [registered movement regression](../benchmarks/rust-piston-movement-2026-10-07/movement-registry-regression.json)
passes again with **2,300,888 lines per JAR** on the integrated sources.
`no_world_collision` implements the entity-bearing collision-free query over the
registry-bound world. It consumes block collisions lazily, then checks whether
the selected entity list is empty, then tests applicable border geometry. Each
stage short-circuits the later providers; a nonempty entity list blocks the query
even if its supplied shape is empty. Collision contexts are supplied explicitly.
`python3 tools/test_world_collision_check_parity.py` executes native
`CollisionGetter.noCollision` over registered blocks and resident Java sections.
The [world collision-check report](../benchmarks/rust-world-collision-check-2026-10-07/scoped-parity.json)
records **4,793,095 matching lines per JAR**. All states, context variants, empty
and disjoint controlled entity/border shapes, missing chunks, boundaries and
provider failures are covered. Workspace Clippy passes. Null-entity overloads,
actual entity-list/border providers and live player ledge behavior remain pending.
The [shared movement regression](../benchmarks/rust-world-collision-check-2026-10-07/movement-regression.json)
also passes with **7,062,798 matching lines per JAR**.
`back_off_from_edge` implements the player ledge guards, above-ground test and
X/Z/diagonal displacement reductions. It retains lazy step/staying/grounded
queries, float step widening, signed-zero behavior and the exact thin collision
probe arithmetic. A caller-supplied query budget bounds nonconverging inputs and
returns an error without fabricating a successful displacement.
`python3 tools/test_edge_backoff_parity.py` executes actual player methods with
controlled collision-free query results. The
[edge backoff report](../benchmarks/rust-edge-backoff-2026-10-07/scoped-parity.json)
records **46,578 matching lines per JAR**, covering all mover types, flight/crouch
guards, fall/step and 0.05 thresholds, nonfinite values and query failures. Two
query-budget unit tests and workspace Clippy pass. Registered-world ledge probes,
live crouching/attribute state and the complete player movement loop are separate
integration work.
Registered-world ledge integration now runs `back_off_from_edge` through
`no_world_collision` and registry-bound resident chunk scans. The native side
executes actual `Player.maybeBackOffFromEdge` and its collision probes over
`ProtoChunk` sections. Every state is used as a supporting block, with additional
falling, step-height, chunk-edge, diagonal, dynamic-block and guard/error cases.
`python3 tools/test_world_edge_backoff_parity.py` passes with
**27,109,699 matching lines per JAR** in the
[world ledge report](../benchmarks/rust-world-edge-backoff-2026-10-07/scoped-parity.json).
The shared fixture now supports player probes alongside direct movement and
collision checks; workspace Clippy passes. Entity lists, border applicability and
collision contexts remain controlled snapshots. A complete player movement/travel
loop and playable client remain pending.
`check_fall_damage` now implements base-entity fall-distance accumulation and
landing order. Downward displacement narrows to float before being subtracted
from the double fall distance. Grounded landings call the block, read the
possibly changed position/support, emit the ground event and reset fall distance.
Errors preserve completed field writes and callback effects.
`python3 tools/test_fall_damage_parity.py` runs actual `Entity.checkFallDamage`
with controlled water, landing and event providers. The
[base fall report](../benchmarks/rust-fall-damage-2026-10-07/scoped-parity.json)
records **44,566 matching lines per JAR**, including nonfinite arithmetic, float
underflow, callback mutations and failures at every boundary. Workspace Clippy
passes. Living-entity fluid/particle behavior, registered block landing effects,
health/damage and full movement remain pending.
`living_fall` implements default living-entity fall power/damage calculation,
impulse-height exemption and landing damage callback order. It retains separate
immunity checks for passenger propagation and damage calculation, double/float
arithmetic and saturating floor-to-int conversion. Positive damage resets the
impulse context, selects the fall sound, plays block landing sound and dispatches
hurt. A rejected hurt callback does not change the native positive-damage result.
`ImpulseContext` also models setter, grace-extension and reset behavior; disabling
ignore clears grace time while retaining the impact position until a later reset.
`python3 tools/test_living_fall_parity.py` compares actual living methods and
sequential impulse changes. The
[living fall report](../benchmarks/rust-living-fall-2026-10-07/scoped-parity.json)
records **153,025 matching lines per JAR**, including changing immunity, passenger
callback mutations, nonfinite arithmetic, sound threshold selection and failures
after partial state changes. Workspace Clippy passes. Attribute provisioning,
passenger storage/recursion, actual health processing, tick/save/network behavior
and the complete movement lifecycle remain pending.
`push_entities_up` implements the block-replacement push: query old/new shapes,
subtract old occupied space without optimizing the join, translate to world
coordinates and select entities using the added shape's bounds. It reads each
current entity box before calculating its upward displacement and invokes a
relative teleport even when that displacement is zero.
`python3 tools/test_block_push_parity.py` compares actual `Block.pushEntitiesUp`
with controlled shapes and selected entity lists. The
[block push report](../benchmarks/rust-block-push-2026-10-07/scoped-parity.json)
records **101,006 matching lines per JAR**, including empty/redundant geometry,
partial shapes, large coordinates, nonfinite entity boxes, mutations of later
entities and failures after partial effects. Workspace Clippy passes. Registered
replacement dispatch, actual entity selection and teleport/network semantics
remain separate integration work.
`block_landing` binds audited native landing/bounce families to every registered
state. It implements fall-distance reduction, hay/honey damage multipliers,
slime suppression, powder-snow fall sounds, upward dripstone tips, farmland
replacement with occupant pushes, turtle-egg destruction/decrement and shelf
mushroom bounce sounds. Random draws, server-class checks, client flags, spawn
protection, mob griefing, sounds, writes and events retain native order.
`python3 tools/test_block_landing_parity.py` invokes registered native methods for
all **35,723 states / 1,286 blocks** with eight entity class families. The
[registered landing report](../benchmarks/rust-block-landing-2026-10-07/scoped-parity.json)
records **3,524,267 matching lines per JAR**, including float/double boundaries,
NaN/infinity, failed writes, callback failures, egg hatch preservation and
farmland collision pushes. Targeted Clippy passes. Actual health, live entity
selection/storage, teleport/network behavior, audio playback and full movement
lifecycle integration remain separate work.
`movement_emission` accumulates native movement/flight distances, evaluates
climbable and powder-snow states, and dispatches step/swim/flap effects. Legacy
and current support blocks retain their separate sound/event rules. Threshold
updates use Java float-to-int saturation and wrapping integer addition, and
sound/event callbacks can change fields observed by subsequent operations.
`python3 tools/test_movement_emission_parity.py` compares actual native movement
emission, block vibration dispatch, flapping and next-step arithmetic. The
[movement emission report](../benchmarks/rust-movement-emission-2026-10-07/scoped-parity.json)
records **598,611 matching lines per JAR** across **53,036 fixtures**, including
predicate combinations, sound/event modes, differing support blocks, nonfinite
numbers, mutations and provider failures. Targeted Clippy passes. Sound callbacks
are controlled and the crystal-sound predicate is false in this gate; registered
sound selection, audio playback and full movement integration remain pending.
`entity_move` sequences native movement phases: no-physics/piston early exits,
stuck multiplier reset, edge backoff, collision resolution, fall-reset clipping,
position/recording writes, collision/ground flags, landing, removal, restitution,
movement emission and block speed multiplication. `MovementHistory` retains at
most 100 records by merging the oldest pair and dropping their original-axis
movement metadata. Callbacks can change fields read by later phases.
`python3 tools/test_entity_move_parity.py` invokes actual `Entity.move` with native
shape resolution and zero restitution. The
[movement lifecycle report](../benchmarks/rust-entity-move-2026-10-07/scoped-parity.json)
records **543,653 matching lines per JAR**, covering signed zero, tiny/nonfinite
movement, collisions, early exits, recording cap, authority guards, landing
mutations/removal and failures after partial writes. Targeted Clippy passes.
This gate controls piston/edge decisions, ground support, ray hits and landing
callbacks; step height is zero and non-passenger emission is tested separately.
Binding all phases to a live entity/world and player travel remains pending.
`world_ray` implements ordered block/fluid ray clipping, nearest-hit selection
with block precedence on ties, and interaction-shape overrides that replace only
the hit face. It also implements native fluid pick modes and fall-reset shape
selection, including player type identity, end portals/gateways and server-side
zero-delay Nether portals. Traversal limits and invalid geometry return errors.
`python3 tools/test_world_ray_parity.py` compares actual `BlockGetter.clip` and
native `ClipContext` modes. The
[world ray report](../benchmarks/rust-world-ray-2026-10-07/scoped-parity.json)
records **248,725 matching lines per JAR**, including inside hits, ties, misses,
interaction geometry, short/signed-zero rays, lazy predicates/rules and provider
failures. Targeted Clippy passes. Separate limit tests distinguish a miss from
nonfinite geometry, exhausted traversal budget and failed world reads. Shapes
and state predicates are controlled; registered shape binding, actual fluid
shape caching and full entity/world integration remain pending.
`FluidShapeCache` matches native registered-fluid shape caching. The first
successful lookup of a nonempty fluid state samples the fluid above and retains
its resulting shape across later positions/world views. Failed reads leave the
state uncached. Empty and full cube shapes preserve canonical identity; distinct
noncanonical cached shapes retain their own identities.
`python3 tools/test_fluid_shape_parity.py` runs every registered native fluid state
in changing query sequences. The
[fluid shape report](../benchmarks/rust-fluid-shape-2026-10-07/scoped-parity.json)
records **387,950 matching lines per JAR** across **5,181 sequences**, comparing
geometry, cache population, canonical/alias identities, query suppression and
failures. Targeted Clippy passes. The pinned registry has no amount-nine state;
unsupported custom fluid definitions are outside this module. Fluid propagation,
entity immersion and live world/ray integration remain pending.
`InteractionShapes` imports a complete state-bound table with a distinct table
kind and mandatory canonical identity metadata. The pinned owner audit finds
only default empty, cauldron, composter, hopper and scaffolding implementations;
all are static per state. Geometry uses the existing validated discrete shape
importer while preserving eight native shape identities.
`python3 tools/test_interaction_shape_parity.py` compares every registered state
and actual native interaction-face overrides with supplied collision geometry.
The [interaction shape report](../benchmarks/rust-interaction-shape-2026-10-07/scoped-parity.json)
records **188,682 matching lines per JAR** across all **35,723 states**. Native
interaction-shape world queries are rejected by the fixture. Import checks reject
wrong table kind, partial mappings, missing canonical metadata, foreign state
ordering and invalid IDs. Targeted Clippy passes. Registered outline/visual
shapes, complete ray-world binding and gameplay integration remain pending.
`FallRayRegistry` binds fall-reset tags, portal identities, interaction geometry
and fluid states to the complete registered block-state table. `fall_reset_ray`
uses that binding with the shared fluid-shape cache and native water selection.
Tag reloads produce new validated registry snapshots; unknown tag members and
invalid state IDs are rejected.
`python3 tools/test_registry_fall_ray_parity.py` compares actual registered
`BlockGetter.clip` behavior with native block/fluid tags and shape getters. The
[registered fall-ray report](../benchmarks/rust-registry-fall-ray-2026-10-07/scoped-parity.json)
records **3,024,623 matching lines per JAR** across **120,297 fixtures**, including
all **35,723 states**, tag reloads, server/client distinctions, player type checks,
portal delays, changing above-fluid states, shared cache reuse and failures.
Targeted Clippy passes. World storage is controlled; live entity movement and
complete player/world gameplay integration remain pending.
`living_landing` wraps base fall handling with fluid refresh, server-only changed
block notification and landing particles, followed by climbing-position cleanup.
Particle positions preserve the native support-block edge projection and capture
entity coordinates before later callbacks. Attribute, fluid, particle and block
callbacks can mutate fields; failures retain preceding writes.
`python3 tools/test_living_landing_parity.py` invokes actual
`LivingEntity.checkFallDamage` and its base implementation. The
[living landing report](../benchmarks/rust-living-landing-2026-10-07/scoped-parity.json)
records **244,844 matching lines per JAR**, including server/nonserver levels,
water changes, numeric boundaries, particle locations/counts, callback failures,
field mutations and climbing cleanup. Targeted Clippy passes. Fluid immersion,
changed-block enchantments, particle rendering and live gameplay binding remain
pending; those providers are controlled by this gate.
`living_air` implements input normalization/rotation, friction-influenced speed,
ladder/scaffolding limits, relative movement, collision-triggered climbing and
air travel. Ground friction is captured before movement while levitation,
gravity and drag are sampled afterwards. Player class identity controls ladder
slide suppression. Native float arithmetic and quantized trigonometry are kept.
`python3 tools/test_living_air_parity.py` invokes the actual native private air,
relative movement, climbing, speed, friction and input-vector methods. The
[air travel report](../benchmarks/rust-living-air-2026-10-07/scoped-parity.json)
records **443,554 matching lines per JAR**, including both player/nonplayer
classes, changed ground/climbing predicates, missing client chunks, levitation,
nonfinite boundaries, callback mutations and failures. Targeted Clippy passes.
Extreme effect amplifiers are injected directly for integer-boundary checks;
normal constructor clamping is outside this gate. Collision movement, gravity,
attributes and immersion remain controlled providers; live gameplay binding and
complete player travel are pending.
`living_fluid` adds native water/lava acceleration, slowdown, falling adjustment,
shallow-lava handling, collision escape and ridden buoyancy. It shares input
rotation with air movement. Fluid heights and escape queries remain lazy, with
movement mutations visible to subsequent velocity updates.
`python3 tools/test_living_fluid_parity.py` compares the actual native travel and
fluid helper methods. The
[fluid travel report](../benchmarks/rust-living-fluid-2026-10-07/scoped-parity.json)
records **265,100 matching lines per JAR**, including sprint changes, movement
efficiency, dolphin effects, shallow-fluid boundaries, escape probes, ridden
float guards, nonfinite values, callback mutations and failures. Targeted Clippy
passes. Collision movement, immersion depths, free-space queries, attributes and
gravity are controlled; live fluid propagation and gameplay binding remain
pending.
`living_motion` implements default living jump strength/boost, sprint jump
impulses, gravity and slow falling, vertical liquid input, rider flight speed
and air drag. Native finite-addition filtering and delayed synchronization flags
preserve partial writes when providers fail.
`python3 tools/test_living_motion_parity.py` compares the corresponding actual
living methods plus `Entity.applyGravity` and `addDeltaMovement`. The
[jump and gravity report](../benchmarks/rust-living-motion-2026-10-07/scoped-parity.json)
records **113,623 matching lines per JAR**, including float thresholds, extreme
raw effect amplifiers, signed zero/nonfinite values, rider classes, callback
mutations and failures. Targeted Clippy passes. Entity-type jump/flight overrides,
effect and attribute storage, registered jump-factor binding and live gameplay
integration remain pending.
`player_travel` wraps living travel with passenger bypass, swimming pitch
adjustment, head-fluid checks and preservation of creative-flight vertical
velocity. It also binds player flight speed to sprint/passenger/ability rules
and implements the flying ability's fluid-affection predicate.
`python3 tools/test_player_travel_parity.py` invokes actual `Player.travel`,
`getFlyingSpeed` and `isAffectedByFluids`. The
[player travel report](../benchmarks/rust-player-travel-2026-10-07/scoped-parity.json)
records **120,933 matching lines per JAR**, including ability and velocity
mutations, callback failures, signed zero/nonfinite positions and the distinction
between direct ability fields and virtual ability access. Targeted Clippy passes.
Parent travel is selected through a controlled fluid callback; connecting the
verified living phases and collision movement to the live player/world remains
pending.
`ClimbingRegistry` binds resolved climbing/glide-through tags and actual trapdoor
class identities to all registered states. `on_climbable` preserves spectator
and gliding guards, open-trapdoor/ladder facing checks, wrapping below-position
arithmetic and last-climbable position writes. Negative or failed checks retain
the previous climbing position. Unknown members/properties and IDs are rejected.
`python3 tools/test_climbing_parity.py` invokes actual registered
`LivingEntity.onClimbable` and trapdoor support checks. The
[climbing report](../benchmarks/rust-climbing-2026-10-07/scoped-parity.json)
records **3,820,054 matching lines per JAR** across all **35,723 states**, including
all trapdoor states against every registered ladder facing, tag reloads,
spectator/gliding guards, captured positions, mutations and failures. Targeted
Clippy passes. Entity/world storage is controlled; live movement binding and
equipment-based glide eligibility remain pending.
`fluid_occupancy` implements section-ordered liquid checks over resident block
sections with a complete registered fluid-presence table. `BlockSection.any_state`
checks active palette entries so dry sections skip cell unpacking. Bounds use
inclusive floored endpoints, and chunk requests retain native behavior even when
no requested vertical section is within world height. Invalid geometry, foreign
registries and query-budget exhaustion return explicit errors.
`python3 tools/test_fluid_occupancy_parity.py` compares actual
`LevelReader.containsAnyLiquid`, `BoxBlockMatcher` and `BlockScanUtils` with
native ProtoChunk sections. The
[liquid occupancy report](../benchmarks/rust-fluid-occupancy-2026-10-07/scoped-parity.json)
records **116,664 matching lines per JAR**, including fluid presence for all
**35,723 states**, public chunk/section query order, height boundaries, palette
changes/compaction and failures. Rust-only checks verify typed budget, nonfinite
and registry errors. Targeted Clippy passes. Chunk snapshots repeat controlled
resident data; collision composition for `Entity.isFree` and live world binding
remain pending. No performance gain is claimed without measurement.
`free_space.offset_is_free` composes native offset bounds, registry-bound
block/entity/border collision clearance and resident liquid occupancy. The
liquid scan runs only after collision clearance succeeds. Both phases share
resident TerrainChunk storage through `RegistryCollisionWorld`; their typed
errors and separate query budgets remain visible to the caller.
`python3 tools/test_free_space_parity.py` invokes actual `Entity.isFree`, native
collision iteration and liquid scanning on the corresponding resident ProtoChunk
storage. The [free-space report](../benchmarks/rust-free-space-2026-10-07/scoped-parity.json)
records **5,764,046 matching lines per JAR** across all **35,723 states**, offsets,
fluid/context variants, height boundaries, required missing chunks and failures.
Targeted Clippy passes. Entity lists, border applicability and collision contexts
are controlled; chunk generation, live entity indexing and full playable
integration remain pending.
The [collision-only regression](../benchmarks/rust-free-space-2026-10-07/collision-regression.json)
also passes **4,793,095 matching lines per JAR** after extending the shared
fixture and registry binding.
`entity_fluid` tracks body depth, eye immersion and current accumulation across
updates. It preserves one-tick tracker retention, missing-chunk preflight,
ordered cell scans, the first matching current tag, camera support checks and
partial writes on query failure. Current application distinguishes player
averaging from other entities' normalization and dispatches the final velocity
addition with its finite-input filter and fresh velocity read.
`python3 tools/test_entity_fluid_parity.py` invokes actual
`EntityFluidInteraction` and `Entity.addDeltaMovement`. The
[entity fluid report](../benchmarks/rust-entity-fluid-2026-10-07/scoped-parity.json)
records **607,338 matching lines per JAR** with real ProtoChunk fluid-presence
sections, ordered/reloaded overlapping tags, wet/dry sequences, eye boundaries,
nonfinite heights/current arithmetic, mutations and injected failures. Rust-only
checks cover explicit query-budget/nonfinite errors and reset-before-error
behavior. Targeted Clippy passes. Fluid heights/flows and entity fields are
controlled here; neighboring-cell flow calculation, live world/entity binding
and full playable integration remain pending. Extreme-coordinate Java scans are
bounded by injected callback failures rather than allowed to traverse billions
of cells.
`fluid_flow` computes water/lava current vectors from ordered horizontal and
lower neighbors, preserving f32 height subtraction before f64 accumulation.
Falling fluids apply the native wall deflection, including the same-family,
upward-face and IceBlock guards, then normalize the resulting vector.
`python3 tools/test_fluid_flow_parity.py` invokes actual registered
`FluidState.getFlow`, `FlowingFluid.getFlow` and its solid-face helper. The
[fluid flow report](../benchmarks/rust-fluid-flow-2026-10-07/scoped-parity.json)
records **1,051,071 matching lines per JAR** from **51,846 fixtures** covering all
registered fluid states, neighboring families/heights, per-face wall flags,
falling deflection, wrapping coordinates and query failures. Targeted Clippy
passes. Block tag/class flags and face support are controlled in this comparison;
binding those to registered block storage and support shapes, fluid spreading
and complete gameplay remain pending.
`registry_fluid` now binds contained fluid states, resolved flow-blocking tags and
actual IceBlock class membership to the full block registry. Its world adapter
composes current/height/camera queries with cached and dynamic support shapes.
Foreign registry identities, unknown tag members and invalid state IDs are
rejected explicitly; tag reloads use a new immutable binding.
`python3 tools/test_registry_fluid_parity.py` compares actual registered height,
camera immersion, current vectors and solid-face queries. The
[registered fluid report](../benchmarks/rust-registry-fluid-2026-10-07/scoped-parity.json)
records **2,446,969 matching lines per JAR** from **409,389 fixtures**, covering all
**35,723 block states**, waterlogged contents, cached/dynamic support, natural and
reloaded tags, neighboring fluid families, coordinate wrapping and failures.
Targeted Clippy passes, including checks for typed invalid-ID and foreign-registry
errors. World cells are controlled and block entities are absent in this suite;
active block-entity lifecycle, live entity binding, fluid spreading and complete
playable integration remain pending.
`entity_fluid_tick` composes immersion updates with entity water-entry behavior
and current application. It captures water/lava membership before effects,
resets fall distance in water, dispatches a splash after the first tick when
newly entering water, updates the touching-water flag and queries the push
predicate again before applying forces. Lava uses the dimension's FAST_LAVA
attribute to select its current coefficient.
`python3 tools/test_entity_fluid_tick_parity.py` invokes actual
`Entity.updateFluidInteraction` with native immersion and current application.
The [entity fluid tick report](../benchmarks/rust-entity-fluid-tick-2026-10-07/scoped-parity.json)
records **953,830 matching lines per JAR**, including changing push predicates,
first-tick/entry flags, simultaneous water/lava, attribute selection, nonfinite
arithmetic, callback mutations and failures around partial writes. The
[immersion regression](../benchmarks/rust-entity-fluid-tick-2026-10-07/immersion-regression.json)
also passes **607,338 lines per JAR** after extending the shared fixtures.
Targeted Clippy passes. Splash dispatch is controlled; audio/particle generation,
full live entity/world binding and playable integration remain pending.
`RegistryFluidWorld` now implements entity immersion queries through the bound
fluid contents, height calculations, camera support and neighbor-derived current
vectors. Entity fields and loaded chunk/section views remain supplied by the
world provider, preserving captured positions and partial-write order.
`python3 tools/test_registered_entity_fluid_parity.py` invokes actual
`EntityFluidInteraction` with registered fluid and support behavior. The
[registered immersion report](../benchmarks/rust-registered-entity-fluid-2026-10-07/scoped-parity.json)
records **6,550,126 matching lines per JAR**, including all **35,723 states** in
immersed and above-eye cells, mixed water/lava neighborhoods, waterlogged blocks,
ordered/reloaded tags, current velocities, tracker retention and query failures.
Targeted Clippy passes. Shared-fixture regressions also pass:
[tick composition](../benchmarks/rust-registered-entity-fluid-2026-10-07/tick-regression.json)
(**953,830 lines per JAR**) and
[controlled immersion](../benchmarks/rust-registered-entity-fluid-2026-10-07/immersion-regression.json)
(**607,338 lines per JAR**). Chunk presence and section wet flags are controlled,
and block entities are absent here; full live chunk/entity lifecycle, fluid
propagation and playable gameplay remain pending.
`swimming` implements entity/player swimming transitions, underwater/shallow-water
predicates and the fluid jump threshold. The player flying ability disables
swimming directly. Other transitions preserve short-circuit query order, prior
eye-in-water state, passenger guards, captured block position and final state
writes only after all required queries succeed.
`python3 tools/test_swimming_parity.py` compares actual Entity/Player methods.
The [swimming report](../benchmarks/rust-swimming-2026-10-07/scoped-parity.json)
records **191,142 matching lines per JAR**, including flag combinations, native
fluid tag membership, failures/mutations, and f32 eye-height boundaries/nonfinite
values. Targeted Clippy passes. Synchronized entity storage, full input/tick
integration and playable gameplay remain pending.
`fluid_box` implements default entity immersion bounds and boat passenger
waterline clipping. Entity bounds are deflated and captured before vehicle
lookup. Submerged boats retain those bounds; other boats restrict immersion to
the portion strictly above their top, returning no box when none remains.
`python3 tools/test_fluid_box_parity.py` compares actual entity/boat methods. The
[fluid box report](../benchmarks/rust-fluid-box-2026-10-07/scoped-parity.json)
records **92,822 matching lines per JAR**, including actual boat status values,
virtual modifier dispatch, thin/inverted bounds, waterline boundaries, signed
zero/nonfinite values and mutations/failures. Targeted Clippy passes. Vehicle
snapshots are controlled; live passenger lifecycle and full gameplay remain
pending.
`water_splash` generates native water-entry sound, bubble/splash particle and game
event requests. It preserves controlling-passenger identity, captured velocity,
f32 volume/pitch arithmetic, float-rounded surface height, changing entity width,
and random draws before each emitted effect. A particle budget returns an
explicit error after preserving preceding effects and RNG consumption.
`python3 tools/test_water_splash_parity.py` invokes actual
`Entity.doWaterSplashEffect` with native legacy and xoroshiro random generators.
The [water splash report](../benchmarks/rust-water-splash-2026-10-07/scoped-parity.json)
records **192,506 matching lines per JAR** across **7,840 fixtures**, including
sound thresholds, self/other passengers, particle positions/velocities, callback
mutations/failures, nonfinite arithmetic and the next RNG value after the effect.
A Rust-only budget check verifies that exhaustion preserves the two sound-pitch
random draws. Targeted Clippy passes. Sound identities and effect sinks are
controlled; audio playback, particle simulation/rendering and full gameplay
integration remain pending.
`attributes` implements basic/ranged attribute instances, ordered modifiers,
three-stage value calculation, cache invalidation and permanent-state packing.
Modifier clones retain reference identity for transient-update notifications.
Per-operation maps preserve native hash-table iteration, growth and deletion
order because modifier arithmetic is sensitive to floating-point association.
The implementation also retains native partial writes when a dirty observer
fails, stale operation entries after operation-changing updates, merge-on-apply
semantics and self-replacement behavior.
`python3 tools/test_attribute_parity.py` compares actual `AttributeInstance`
methods using every registered attribute definition. The
[attribute report](../benchmarks/rust-attributes-2026-10-07/scoped-parity.json)
records **1,404,798 matching lines per JAR** across **2,391 fixtures**, including
collision clusters, resize/shrink boundaries, seeded operation sequences,
reference identity, observer cache reads/failures, nonfinite values and signed
zero. The adapter observes iterator order, as native calculation does; Java
stream traversal can differ. Targeted Clippy passes. Registry/entity/equipment
binding, packed data/network codecs and full gameplay integration remain pending.
`attributes::entity` imports version-checked attribute definitions and entity
supplier bases, and composes them with the attribute engine. Reads fall back to
the supplier without creating instances; first instance access schedules an
update and a sync for client-syncable attributes. Mutations retain those set
memberships until individually acknowledged. Base resets use the entity's
supplier value and do not instantiate absent entries. Missing attributes and
missing modifiers remain distinguishable, including lookup after instantiation.
`python3 tools/test_entity_attribute_parity.py` compares actual `AttributeMap`
operations with **40 registered attributes** and **93 entity suppliers**. The
[entity attribute report](../benchmarks/rust-entity-attributes-2026-10-07/scoped-parity.json)
records **1,771,555 matching lines per JAR** across **4,720 fixtures**. Targeted
Clippy passes. The exporter asserts that registered default suppliers contain no
modifiers. Set membership is observed in registry order: this does not establish
JVM identity-hash collection order, cross-attribute bulk assignment/serialization,
custom suppliers, equipment integration or a live entity tick.
`food` implements eating, saturation, exhaustion, hunger predicates and the
server hunger tick. It retains the captured level/difficulty, short-circuit
player queries, fast/slow regeneration timers, starvation health/difficulty
guards, wrapping integer arithmetic, Java float edge behavior and partial state
writes when callbacks fail. Heal and starvation requests use explicit world
hooks, which can mutate food state before subsequent tick work.
`python3 tools/test_food_parity.py` compares actual `FoodData` methods. The
[food report](../benchmarks/rust-food-2026-10-07/scoped-parity.json) records
**180,878 matching lines per JAR** across **15,211 fixtures**, including 240-tick
sequences, threshold boundaries, all difficulties, callback mutation/failure,
signed zero and nonfinite arithmetic. Targeted Clippy passes. World rules,
player health/healing and damage delivery are controlled; consumables, saved
hunger data and live survival gameplay integration remain pending.
`food_storage` reads/writes hunger state in player NBT compounds. Missing and
nonnumeric fields use native defaults; numeric tags retain vanilla coercions,
including floor-to-int for floats/doubles, truncation of long integer bits and
no post-load clamping. Writes replace the four hunger fields with native int/
float types, normalize float signed zero and preserve unrelated player fields.
`python3 tools/test_food_storage_parity.py` compares actual `FoodData` persistence
through `TagValueInput`/`TagValueOutput`. The
[food storage report](../benchmarks/rust-food-storage-2026-10-07/scoped-parity.json)
records **45,955 matching lines per JAR**, covering every NBT numeric type,
missing/wrong-type fields, conversion boundaries, nonfinite values and save/load
round trips. Targeted Clippy passes. ProblemReporter diagnostics and the complete
player save lifecycle remain pending; these results establish the four hunger
fields, not a playable save/load implementation.
`living_health` implements health/absorption clamping, healing dispatch, player
hurt and living dead-or-dying predicates. Health writes capture synchronized
storage before attribute lookup. `SyncedFloat` preserves Java boxed-float
equality, writes the value before the update callback, and marks dirty only
after that callback succeeds; it also supports default/dirty extraction for a
single float item.
`python3 tools/test_living_health_parity.py` compares actual LivingEntity/Player
methods and actual `SynchedEntityData` float items. The
[living health report](../benchmarks/rust-living-health-2026-10-07/scoped-parity.json)
records **442,007 matching lines per JAR**, covering nonfinite values, signed
zeros/NaN equality, forced updates, dirty extraction, health-data replacement
during callbacks and partial effects after exceptions. Targeted Clippy passes.
Attribute values and the internal absorption sink are controlled. Player-specific
absorption synchronization, multiple synchronized items, registered attribute
binding, full damage processing and playable entities remain pending.
`attribute_health` binds the health engine to registered entity attributes and
mutable synchronized health. `AttributeHealth` borrows existing state, queries
actual modified MAX_HEALTH/MAX_ABSORPTION values and propagates observer errors
without losing partial health writes. Base living absorption uses field storage.
`python3 tools/test_attribute_health_parity.py` composes actual registered
`AttributeMap`, LivingEntity/Player health methods, `SynchedEntityData` and
`FoodData`. The [composition report](../benchmarks/rust-attribute-health-2026-10-07/scoped-parity.json)
records **666,082 matching lines per JAR**, including all **93 entity suppliers**,
attribute base/modifier changes, real regeneration health writes, 100-tick hunger
sequences and failed synchronization callbacks. Targeted Clippy passes. The
internal absorption sink and starvation damage delivery are controlled;
player absorption synchronization, attribute-change refresh, full damage and
live gameplay integration remain pending.
Entity attribute storage now shares immutable supplier bases and allocates each
mutable instance only on first access. This retains dense lookup indices while
avoiding space for unused instance objects in every entity.
`python3 tools/measure_attribute_memory.py --phase before|after` measures a Linux
release-process workload of 20,000 held-live zombie attribute maps, using five
fresh processes per case. Median process RSS changed from **175,820 to 12,848
KiB** with defaults only, and **175,800 to 29,076 KiB** with four active attributes
per entity. Both cases retain the same health-read checksum. The
[before](../benchmarks/rust-attribute-memory-2026-10-07/before.json) and
[after](../benchmarks/rust-attribute-memory-2026-10-07/after.json) reports record
samples and source hashes; the baseline entity implementation is `fd185a6`.
RSS includes runtime, catalog and allocator overhead. This is not whole-game
memory, a timing benchmark or evidence of an FPS improvement.
The optimized implementation passes both pinned JAR comparisons again:
[entity attributes](../benchmarks/rust-attribute-memory-2026-10-07/entity-regression.json)
(**1,771,555 lines per JAR**) and
[health/hunger composition](../benchmarks/rust-attribute-memory-2026-10-07/health-regression.json)
(**666,082 lines per JAR**). Targeted Clippy passes.
`combat_rules` implements armor/toughness and magic-protection damage arithmetic.
It preserves the nonnull-weapon/server-level guards and clamps modified armor
effectiveness only after the server enchantment hook.
`python3 tools/test_combat_rules_parity.py` compares actual `CombatRules` methods.
The [combat rules report](../benchmarks/rust-combat-rules-2026-10-07/scoped-parity.json)
records **184,248 matching lines per JAR**, including armor/toughness boundaries,
random float bit patterns, nonfinite/signed-zero values, query mutations/failures,
null/empty/unenchanted weapons and server/nonserver branches. Native unenchanted
stacks have explicitly empty components. Targeted Clippy passes. Enchanted item
components, damage tags, armor durability and the complete damage pipeline remain
pending; the exposed enchantment hook is not an enchantment implementation.
`living_damage` implements the inner `actuallyHurt` sequence for base living
entities and players. It preserves invulnerability/armor/magic dispatch, both
absorption reads before the first write, guarded absorbed statistics, Java float
rounding, player exhaustion/taken statistics, base-living second absorption
writes, and combat/health/game-event ordering. Callback failures retain preceding
writes and effects.
`python3 tools/test_living_damage_parity.py` compares actual LivingEntity/Player
methods with real final absorption clamping and controlled phase/storage sinks.
The [living damage report](../benchmarks/rust-living-damage-2026-10-07/scoped-parity.json)
records **161,198 matching lines per JAR**, including entity/player paths, attacker
types, stat limits/rounding, nonfinite values, mutations and failures at query
boundaries. Targeted Clippy passes. Armor/magic results, health storage, combat/
stat sinks and exhaustion delivery are controlled. Outer hurt gates, resistance/
equipment binding, combat tracking and playable damage integration remain pending.
`player_food` implements player exhaustion, eating eligibility and the hunger
threshold for exhaustive manoeuvres. Invulnerability reads the abilities field
directly. Exhaustion additionally checks the client/server side before updating
direct food storage; manoeuvre eligibility uses virtual food and ability lookups.
`StoredPlayerFood` binds these operations to ordinary mutable `FoodData` state.
`python3 tools/test_player_food_parity.py` compares actual Player methods and
native FoodData. The [player food report](../benchmarks/rust-player-food-2026-10-07/scoped-parity.json)
records **32,723 matching lines per JAR**, covering direct/virtual distinctions,
captured food identity during mutations, guard short-circuiting, injected failures,
nonfinite exhaustion and integer hunger boundaries. The stored-state binding is
also compared. Targeted Clippy passes. Consumable components, full ability storage
and live player tick integration remain pending.
`damage_reduction` composes native armor/toughness arithmetic with living damage
bypass checks and armor-durability dispatch. Its magic-reduction path preserves
resistance amplifier overflow, reduced-damage clamping, resisted statistics,
repeated attacker lookup and the server-only enchantment protection query.
Armor attributes floor to Java's saturated integer range before float conversion.
`python3 tools/test_damage_reduction_parity.py` compares actual living methods
for base entities and ServerPlayer receivers. The
[damage reduction report](../benchmarks/rust-damage-reduction-2026-10-07/scoped-parity.json)
records **78,069 matching lines per JAR**, covering bypass combinations,
resistance/stat boundaries, numeric edges, query failures/mutations and actual
empty-equipment protection iteration. Targeted Clippy passes. Equipment is empty;
enchanted components, actual armor durability, registered damage/effect bindings
and the full hurt sequence remain pending.
`synced_floats` stores multiple synchronized float fields. It preserves boxed
float equality, per-field/global dirty state, ascending-ID dirty/default lists,
received assignment without newly marking dirty, per-entry and batch callbacks,
and prefix effects when an observer or field lookup fails. Callbacks may reenter
the table to set/assign fields or drain existing dirty values.
`python3 tools/test_synced_floats_parity.py` compares actual `SynchedEntityData`.
The [synchronized float report](../benchmarks/rust-synced-floats-2026-10-07/scoped-parity.json)
records **554,909 matching lines per JAR**, including forced/equal updates,
received duplicates, reentrant operations, missing IDs, callback failures and
NaN/signed-zero equality. Native gaps are untouched default float items; observed
keys are explicit configured IDs. Targeted Clippy passes. Other serializers,
serializer-mismatch errors, wire codecs and player absorption binding remain
pending.
`player_health` binds ordinary registered player attributes to health and
absorption in one synchronized float table. The player absorption getter and
internal setter use virtual data access; health retains its direct data access.
The final absorption setter still applies the registered maximum before writing.
`python3 tools/test_player_health_parity.py` compares actual Player methods,
registered player attributes and `SynchedEntityData`, exporting the actual pinned
health/absorption field IDs. The
[player health report](../benchmarks/rust-player-health-2026-10-07/scoped-parity.json)
records **243,146 matching lines per JAR**, covering modified limits, healing,
absorption reads/writes, combined dirty/default lists, received assignments,
callback packet drains and failures. Targeted Clippy passes. Observer effects
are controlled; custom virtual data replacement, other synchronized serializers,
wire codecs and full player damage/tick integration remain pending.
`server_player_damage` composes ordinary server-player inner damage with
registered armor/toughness and health/absorption limits, shared synchronized
float storage and stored hunger. Armor break callbacks may change attributes
before the hit queries armor; received damage uses the actual reduction and
health modules, and player exhaustion retains its ability/client guards.
`python3 tools/test_server_player_damage_parity.py` compares the native Player
inner damage method on ServerPlayer receivers, using actual native reduction,
registered modified attributes, synchronized data and FoodData. The
[server-player damage report](../benchmarks/rust-server-player-damage-2026-10-07/scoped-parity.json)
records **373,455 matching lines per JAR**, covering repeated hits, bypass flags,
resistance, numeric edges, armor attribute mutation, dirty packet drains and
callback failures. Targeted Clippy passes. Empty equipment and controlled
source/effect, durability, combat/stat/event services bound this scope; outer
hurt gates, enchanted equipment and the complete player lifecycle remain pending.
`living_hurt` implements the outer living hurt sequence: early rejection,
blocking/freezing/helmet dispatch, non-finite damage sanitization, repeated-hit
cooldowns, hurt-animation writes, attribution, impact/knockback, death/sound
branches, last-source timestamps, effect notifications and criterion dispatch.
Services receive live hurt state, including the distinct field writes before and
after the inner hit in fresh-hit and cooldown-difference branches.
`python3 tools/test_living_hurt_parity.py` invokes the native LivingEntity method
directly on base and ServerPlayer receivers. The
[living hurt report](../benchmarks/rust-living-hurt-2026-10-07/scoped-parity.json)
records **441,413 matching lines per JAR**, including numeric edges, repeated
hits, callback mutations/failures, empty-hand death-protection lookup, native
soundless blocking components and victim criteria with no listeners. Targeted
Clippy passes. Inner damage, blocking amounts, sounds, knockback, death and
attribution/effect services are controlled. Successful totems, attacker-player
criteria, actual blocking reduction, full service bindings and player-specific
outer gates remain pending.
`player_hurt` adds the player ability/invulnerability gates, no-action reset,
shoulder removal, damage-source difficulty scaling and exact-zero rejection
before living hurt. The server-player wrapper first checks PvP permission for
player attackers and player owners of arrow attackers. Difficulty is queried
separately for the peaceful, easy and hard branches as in vanilla.
`python3 tools/test_player_hurt_parity.py` compares actual Player and ServerPlayer
methods through the native living hurt sequence. The
[player hurt report](../benchmarks/rust-player-hurt-2026-10-07/scoped-parity.json)
records **410,880 matching lines per JAR**, including all three-query difficulty
combinations, player/arrow-owner PvP gates, repeated hits and callback failures.
Targeted Clippy passes. Native downstream living services retain the controlled
fixture scope above; invulnerability internals, rule/source registries, actual
team permissions, successful totems, attacker server-player criteria and complete
player lifecycle integration remain pending.
`damage_immunity` implements entity permanent/temporary invulnerability and base
source immunity, living enchantment dispatch, ordered player damage gamerules,
and server-player dimension-change/client-loading checks. It preserves early
returns and repeated source-tag queries across the inheritance layers.
`python3 tools/test_damage_immunity_parity.py` compares each native layer on
ServerPlayer receivers, retaining native empty-equipment enchantment iteration.
The [damage immunity report](../benchmarks/rust-damage-immunity-2026-10-07/scoped-parity.json)
records **170,314 matching lines per JAR**, including mixed damage tags, rule
precedence, virtual flag mutations and callback failures. Targeted Clippy passes.
Source/rule queries and virtual flags are controlled; registered source/rule
bindings, nonempty enchantment immunity and full pipeline integration remain
pending.
`server_player_combat` binds server/player/living outer hurt to the checked
registered-attribute, synchronized-health/absorption and hunger inner damage
path. Dead-or-dying reads live health and the direct death flag; the outer
cooldown/animation state is shared across hits. PvP, blocking, effects,
attribution, knockback, death and other world services remain explicit.
`python3 tools/test_server_player_combat_parity.py` compares the actual native
ServerPlayer hurt chain through actual inner reduction and player storage. The
[server-player combat report](../benchmarks/rust-server-player-combat-2026-10-07/scoped-parity.json)
records **561,528 matching lines per JAR**, including repeated hits, death
rejection, modified attributes, cooldown differences, packet drains, numeric
edges and failures after partial writes. Some fixtures explicitly reset cooldown
between hits; they do not claim entity-tick coverage. Targeted Clippy passes.
Invulnerability answers, blocking amounts, armor-durability callbacks, effects,
PvP permission, combat/event/knockback/death services and criterion listeners are
controlled. Enchanted items, registered sources, actual lifecycle services and
playable integration remain pending.
The stored-player combat binding now executes the verified server-player
invulnerability predicates at every outer and inner query. Its inner damage body
is shared with standalone living/player damage after the required predicate has
run. Native integration retains inherited Entity/LivingEntity/Player/ServerPlayer
immunity methods, including empty-equipment enchantment iteration, gamerule
precedence, dimension changes and client-loading guards.
The [combat immunity integration report](../benchmarks/rust-server-player-combat-immunity-2026-10-07/scoped-parity.json)
records **1,176,994 matching lines per JAR**. The standalone inner-damage
[regression report](../benchmarks/rust-server-player-combat-immunity-2026-10-07/inner-damage-regression.json)
retains **161,198 matching lines per JAR** after extracting the shared body.
Targeted Clippy passes. Virtual flags, source tags/rule values and the other
world services listed above remain controlled; the fixture now executes the
immunity decisions themselves instead of supplying their final result.
`damage_source` imports version-checked native decoded damage definitions and
resolves their raw tag resources with the shared tag implementation. Sources
retain distinct direct/causing entities and optional explicit positions. Weapon
and fallback position queries use the direct entity; difficulty scaling uses
the stored causing entity, while creative-source detection dispatches virtual
causing-entity access before reading player abilities.
`python3 tools/test_damage_source_parity.py` covers all **51 bundled damage
types and 36 damage-type tags**, using the actual native DamageType codec and
TagLoader. The [damage-source report](../benchmarks/rust-damage-source-2026-10-07/scoped-parity.json)
records **152,175 matching lines per JAR**, including constructor identities,
scaling, exhaustion, tag/type membership, position/weapon queries, virtual
causing-entity replacement, mutations and failures. Targeted Clippy passes.
Catalogs are immutable snapshots with local indices, not network IDs. Rust
DamageType codecs, runtime reload, death-message generation, full entity query
bindings and combat source integration remain pending.
Registered damage sources now drive a composed player-combat fixture. Source
helpers map the immunity, outer-hurt and reduction tag enums to the imported
vanilla tags. Native source methods supply exhaustion, difficulty scaling,
creative-source abilities and direct-entity weapon selection through the real
ServerPlayer hurt chain; thorns also follows its native secondary-sound branch.
`python3 tools/test_registered_player_combat_parity.py` records **1,431,711
matching lines per JAR** in the
[registered player-combat report](../benchmarks/rust-registered-player-combat-2026-10-07/scoped-parity.json),
covering all 51 damage types and 36 tags, direct/causing entity combinations,
repeated hits, health/absorption/hunger, cooldown state and callback failures.
Targeted Clippy passes. Equipment is unenchanted; virtual entity flags/rule
values, blocking amounts, durability, PvP permission, attribution, effects,
knockback/death services and empty criterion listeners remain controlled.
Complete entity lifecycle and playable game integration remain pending.
`blocking_rules` implements damage-reduction angle/type conditions, ordered
reduction sums and clamping, block delay/disable tick rounding and item-damage
threshold/floor arithmetic. Source type-set membership is queried only when its
entry's angle condition reaches that check.
`python3 tools/test_blocking_rules_parity.py` compares native BlocksAttacks
records and direct holder-set membership. The
[blocking rules report](../benchmarks/rust-blocking-rules-2026-10-07/scoped-parity.json)
records **105,068 matching lines per JAR**, including exact angle boundaries,
NaN/infinity/signed zero, randomized float bits, source-type mutations and query
failures. Targeted Clippy passes. Angles are supplied in radians; direction/acos
calculation, component codecs, item durability, sounds and full blocking
integration remain pending.
`view_direction` implements native float-table pitch/yaw vectors and horizontal
blocking angles, using the pinned pure-Rust `libm` 0.2.16 inverse cosine. A local
203,072-input probe found 7,908 differences with the platform `acos`, versus none
with this pinned implementation, so platform math is not used for this path.
`python3 tools/test_view_direction_parity.py` compares actual native view vectors
and Java Math.acos, plus the native view/subtract/normalize/dot/acos composition
used by blocking. The [view-direction report](../benchmarks/rust-view-direction-2026-10-07/scoped-parity.json)
records **226,459 matching lines per JAR**, including random doubles, inverse-
cosine boundaries, arbitrary float rotations, degenerate horizontal vectors and
the widened float-PI fallback. Targeted Clippy passes. Full item-blocking dispatch
and validation against JVMs on other platforms remain pending. This does not
resolve the separately tracked Math.cos/Gaussian portability differences.
`item_blocking` implements living blocking dispatch: item/component capture,
bypass and pierced-arrow rejection, source direction, component reduction,
blocking-item damage dispatch and the later non-projectile melee response.
The virtual level/used hand are queried after reduction; melee response retains
the original server-level argument and performs a fresh direct-entity lookup.
`python3 tools/test_item_blocking_parity.py` compares actual LivingEntity
applyItemBlocking with native components on base and ServerPlayer receivers.
The [item-blocking report](../benchmarks/rust-item-blocking-2026-10-07/scoped-parity.json)
records **87,930 matching lines per JAR**, including callback mutations/failures,
captured items/components, piercing/bypass combinations, native direction/math,
client/stat guards and melee responses. Targeted Clippy passes. Native stacks
are explicitly undamageable; actual damageable-item mutation, blocking eligibility,
component codecs and complete combat/world integration remain pending.
`item_use` implements blocking-item eligibility and both elapsed-use timer
overloads. It retains the original blocking delay while rereading active-item
storage and remaining ticks after the virtual duration query; partial-tick
queries preserve the second virtual use-state check.
`python3 tools/test_item_use_parity.py` compares the actual inherited native
methods with real blocking components and controlled virtual item durations.
The [item-use report](../benchmarks/rust-item-use-2026-10-07/scoped-parity.json)
records **108,690 matching lines per JAR**, covering wrapping tick arithmetic,
delay boundaries, absent components, empty stacks, shared item types, partial
float values and callback mutations/failures. Targeted Clippy passes. Full
item-use lifecycle, damageable-item storage and complete combat/world integration
remain pending.
`item_durability` stores the durability projection of an item stack, including
raw versus visible counts/components, clamped damage access, damageability/break
predicates and wrapping count changes. Server-level damage preserves creative
immunity, the positive float enchantment pipeline, advancement-before-write and
copy-before-shrink ordering. The non-breaking variant retains its native empty
break consumer, including unusual invalid component values.
`python3 tools/test_item_durability_parity.py` compares actual unenchanted native
ItemStack operations. The [durability report](../benchmarks/rust-item-durability-2026-10-07/scoped-parity.json)
records **81,762 matching lines per JAR**, including absent components, empty/air
stacks, unbreakable flags, integer boundaries, callback mutations and failures.
Targeted Clippy passes. This is a durability projection, not complete item-stack
component storage. Enchantment effects, component codecs, equipment break
handling and full gameplay integration remain pending.
`blocking_item_damage` composes blocking-component item-damage arithmetic with
stored durability. It preserves player-only handling, the passed level's client
guard for item-use statistics, the later virtual entity-level check and the
server-player-only creative/advancement queries. Break callbacks receive the
pre-shrink stack copy and the caller's original equipment slot.
`python3 tools/test_blocking_item_damage_parity.py` compares actual native
BlocksAttacks calls into ItemStack storage on non-player, Player and ServerPlayer
receivers. The [blocking durability report](../benchmarks/rust-blocking-item-damage-2026-10-07/scoped-parity.json)
records **71,800 matching lines per JAR**, including scalar float boundaries,
invalid/absent durability components, statistic item capture, callback mutations
and failures. Targeted Clippy passes. Stacks are unenchanted; full component
storage, equipment lifecycle and complete combat/world integration remain pending.
`item_use_lifecycle` implements living use ticks, per-item updates, completion,
release and stop ordering. Stable stack handles preserve type versus identity
checks, rereads after virtual hand queries, captured level/item arguments,
wrapping countdowns, returned-item placement and failure-visible state changes.
`python3 tools/test_item_use_lifecycle_parity.py` compares actual inherited native
methods and ItemStack dispatch with controlled custom item handlers. The
[lifecycle report](../benchmarks/rust-item-use-lifecycle-2026-10-07/scoped-parity.json)
records **144,736 matching lines per JAR**, including empty stacks, changed
held/active items, shared item types, client/server queries, finish vibrations,
kinetic-map presence and callback mutation/failure ordering. Targeted Clippy
passes. Starting use, actual synchronized flags, consumable/kinetic effects,
remainder/cooldown components and full inventory/game-tick integration remain
pending.
`item_use_start` starts use from a captured held stack, writes the returned
duration after its callback, synchronizes equipment before changing using/offhand
flags, emits the component's start vibration and resets recent kinetic enemies
when the final active stack has a kinetic-weapon component.
`python3 tools/test_item_use_start_parity.py` compares inherited native
startUsingItem and its private equipment packet construction. The
[start-use report](../benchmarks/rust-item-use-start-2026-10-07/scoped-parity.json)
records **84,873 matching lines per JAR**, including captured stack/level/hand
arguments, empty stacks, callback mutation/failure ordering, flag writes, native
UseEffects/KineticWeapon presence and clearing a populated kinetic-enemy map.
Targeted Clippy passes; all 20 existing horizon-world library tests pass with
these changes. Synchronized flag storage, packet encoding/delivery, kinetic
combat and complete inventory/game-tick integration remain pending.
`item_use_catalog` imports all 1,658 pinned item identities and a typed projection
of their default components for stack size, durability and use-duration/release
queries. Component-driven use preserves consumable precedence over blocking and
kinetic weapons. Registered duration overrides remain separate; consumables
truncate float ticks while instruments floor them. Empty stacks query air
behavior and hide their stored components.
`python3 tools/test_item_use_catalog_parity.py` binds vanilla's actual component
initializers and confirms both JARs export equivalent defaults. The
[registered item-use report](../benchmarks/rust-item-use-catalog-2026-10-07/scoped-parity.json)
records **246,715 matching lines per JAR**, covering every item default, count
changes and component mutation sequences, override behavior, stackability,
durability and integer/float extremes. Targeted Clippy passes. The imported
projection does not implement all item components or their codecs; full inventory,
enchantment effects and stored gameplay integration remain pending.
`component_patch` stores shared immutable prototypes and ordered copy-on-write
patches. Set/remove return values, redundant-value sanitation, explicit removals,
unsanitized restoration, independent copies and saved patch snapshots retain
native behavior. Entry iteration emits patched values before untouched defaults;
key-set order instead applies the patch to the prototype's key sequence.
`python3 tools/test_component_patch_parity.py` compares actual native patched
maps. The [component-patch report](../benchmarks/rust-component-patch-2026-10-07/scoped-parity.json)
records **622,680 matching lines per JAR**, including integer/boxed-float equality,
NaN/signed zero, copy isolation and mutation-before-error when a restored removal
has no prototype default. Targeted Clippy passes. Prototypes have at most seven
keys in this suite; callers supply prototype order and native value equality.
Native large-prototype identity-hash ordering, codecs, mutable payload aliases
and full item/inventory integration remain pending.
`component_durability` binds damage/count queries and mutations directly to
shared component prototypes and patches. The durability algorithm now accepts
`DurabilityStorage`, so writes and storage errors occur at their native points,
including before break callbacks. The earlier plain durability projection
remains supported through the same interface.
`python3 tools/test_component_durability_parity.py` compares native ItemStack
operations with nonempty prototypes and observable patches at every callback.
The [component durability report](../benchmarks/rust-component-durability-2026-10-07/scoped-parity.json)
records **83,727 matching lines per JAR**, including original/copy independence
and mutation-before-error for unsanitized restored removals. Targeted Clippy
passes. The refactor also preserves both native regression suites:
[scalar durability](../benchmarks/rust-component-durability-2026-10-07/scalar-regression.json)
(**81,762 lines per JAR**) and
[blocking durability](../benchmarks/rust-component-durability-2026-10-07/blocking-regression.json)
(**71,800 lines per JAR**). Full component codecs, enchanted durability, equipment
and complete gameplay integration remain pending.
`item_stack_storage` implements stored item identity, count/pop-time storage,
component visibility, copying, splitting, transmutation and consumption. Copies
share component data until a write; canonical empty results are explicit so a
containing item store can preserve reference identity. Negative counts and
wrapping arithmetic follow the pinned methods, including mutations to an empty
stack and consumption callbacks that change or fail after a copy is captured.
`python3 tools/test_item_stack_storage_parity.py` compares 7,856 fixtures with
actual native ItemStack methods and small bound integer-component prototypes.
The [storage report](../benchmarks/rust-item-stack-storage-2026-10-07/scoped-parity.json)
records **568,580 matching lines per JAR**. Comparisons include raw and visible
state, component patch order, stack identity and item/component/count equality.
Targeted Clippy passes. The fixture arena preserves canonical EMPTY aliases;
a production inventory, full component values/codecs and complete item-use,
equipment and game-tick integration remain pending.
`item_stack_refs` adds shared stack identity with automatic reference-counted
lifetime management on the simulation thread. `simple_container` uses these
references for get/set, merging, removals, reverse removal by type, clearing,
capacity checks and item counts. Copies retain independent component patches;
container slots and callers can deliberately share the same stack.
`python3 tools/test_simple_container_parity.py` compares actual native container
and stack methods, including changes and failures in virtual size/change hooks.
The [container report](../benchmarks/rust-simple-container-2026-10-07/scoped-parity.json)
records **590,402 matching lines per JAR**. It checks alias identity, raw/visible
counts, empty-stack references, component-sensitive merging, overflow, invalid
indices and mutation prefixes on failure. In particular, native insertion into
the first empty slot clears the remainder before limiting the inserted copy.
Targeted Clippy passes. Player inventory, menus, crafting accounting, persistence,
arbitrary getItem/setItem overrides and complete gameplay integration remain
pending. Reference counting here has not been benchmarked as a performance gain.
`player_inventory` implements the 36 ordinary slots, seven mapped equipment
slots, shared entity equipment, selected hotbar slot, picking, matching/crafting
eligibility, removals, replacement, clearing and the change counter. Equipment
retains populated entries when cleared. Stack and equipment references can be
shared across inventories; replacing an inventory retains stack aliases.
`python3 tools/test_player_inventory_parity.py` compares actual native Inventory,
EntityEquipment and ItemStack methods. The
[inventory report](../benchmarks/rust-player-inventory-2026-10-07/scoped-parity.json)
records **790,440 matching lines per JAR**, including invalid-index failure
prefixes, selected-slot changes, negative equipment removal amounts, ordinary
versus equipment identity, self-replacement and shared equipment clearing.
Components cover damage, unbreakable presence, a fixed enchantment and literal
custom names. Native Map.of iteration order varies by JVM; fixtures explicitly
supply equipment-map order to both sides when removing an aliased reference.
Targeted Clippy passes. Pickup, inventory/equipment ticks, menus, recipe
accounting, persistence, full component values and complete gameplay integration
remain pending.
`inventory_pickup` composes player slot search and insertion with shared stack
storage. Search checks the selected slot, offhand, then ordinary slots. Insertion
consumes its source, preserves component-sensitive merging and pop time, and
handles damaged stacks and creative fallback at their native callback points.
`python3 tools/test_inventory_pickup_parity.py` compares actual native
Inventory.add/getSlotWithRemainingSpace, ItemStack operations and shared
equipment. The [pickup report](../benchmarks/rust-inventory-pickup-2026-10-07/scoped-parity.json)
records **424,282 matching lines per JAR**, including source/destination aliases,
callback mutations, failures, count overflow, invalid slots and the damaged
copy-and-clear that happens before slot validation. Targeted Clippy passes.
Native crash-report wrapping is represented as an error; diagnostic text is not
compared. Item-entity pickup events, networking, inventory ticks, menus, full
components and complete gameplay integration remain pending.
`inventory_tick` composes inventory/equipment iteration with ItemStack's pop-time
update and ServerLevel-only item dispatch. It retains stack arguments across
level callbacks, reads hotbar selection at the native point and observes changes
to later equipment entries during the same tick. Aliased stacks can be visited
more than once, with each visit updating their shared pop-time counter.
`python3 tools/test_inventory_tick_parity.py` compares actual Inventory.tick,
EntityEquipment.tick and ItemStack.inventoryTick with custom item handlers. The
[tick report](../benchmarks/rust-inventory-tick-2026-10-07/scoped-parity.json)
records **195,957 matching lines per JAR**, including empty stacks, callbacks
that mutate later slots, weakly consistent equipment iteration and failure
prefixes. The client comparison uses an actual allocated ClientLevel for the
non-server branch; the dedicated JAR uses null because ClientLevel is absent.
Targeted Clippy passes. Registered items' individual tick effects, full entity
and world ticking and complete gameplay integration remain pending.
`player_equipment` binds the main hand to the selected inventory slot and other
equipment to the shared entity map. Hand/slot writes capture the previous item,
store the new reference and then invoke the equip callback. Clearing the base
equipment map does not clear the selected stack; clearing the inventory does.
`python3 tools/test_player_equipment_parity.py` compares actual PlayerEquipment
and inherited LivingEntity hand/slot access over a real native Inventory. The
[equipment report](../benchmarks/rust-player-equipment-2026-10-07/scoped-parity.json)
records **408,852 matching lines per JAR**, including selection changes, callback
mutations/failures, old/new aliases, raw enum-map main-hand entries and the
selected main-hand override. Targeted Clippy passes. Full onEquipItem effects,
synchronized flags, active-use integration and complete gameplay integration
remain pending.
The item-use interfaces now accept cloned shared references as well as small
copyable handles. `StackRef` equality compares object identity; component/count
value comparisons remain explicit. Captured references stay alive through
callbacks that replace the active or held stack. The lifecycle fixture now uses
the production reference-counted stack implementation.
The native regressions retain **144,736 lifecycle**, **84,873 start-use** and
**108,690 eligibility/timing** matching lines per JAR. Reports:
[lifecycle](../benchmarks/rust-shared-item-use-2026-10-07/item-use-lifecycle.json),
[start](../benchmarks/rust-shared-item-use-2026-10-07/item-use-start.json),
[eligibility](../benchmarks/rust-shared-item-use-2026-10-07/item-use.json).
Targeted Clippy and all 20 horizon-world library tests pass. Hand queries and
flags remain controlled in these fixtures; composing them with actual player
inventory, synchronized flags and full item effects remains pending.
`synced_values` shares the synchronized scalar algorithm between bytes and
floats, retaining Java boxed-float equality. `living_use_flags` binds the pinned
byte field to using-item/offhand queries and signed-mask flag writes. Flag writes
use the same write-before-callback, callback-before-dirty ordering as other
synchronized values.
`python3 tools/test_synced_bytes_parity.py` compares actual byte SynchedEntityData
and inherited LivingEntity flag methods. The
[byte/flag report](../benchmarks/rust-synced-bytes-2026-10-07/scoped-parity.json)
records **572,100 matching lines per JAR**, covering all initial bytes, signed
masks, forced updates, assignments, reentrant callbacks, dirty packing and
failures. The [float regression](../benchmarks/rust-synced-bytes-2026-10-07/float-regression.json)
retains **554,909 matching lines per JAR**. Targeted Clippy passes. Mixed-serializer
storage, entity schemas, wire codecs and full item-use/gameplay integration remain
pending.
`inventory_use` binds living item-use ticks, completion, release and stop to
actual player inventory/hands, shared stack references and synchronized byte
flags. Equipment storage changes precede equip callbacks; synchronized flag
writes retain their value/callback/dirty ordering. Effects receive the same
mutable inventory, flag storage and active-use state.
`python3 tools/test_inventory_use_parity.py` compares inherited native lifecycle
methods composed with real Inventory, PlayerEquipment and SynchedEntityData. The
[combined report](../benchmarks/rust-inventory-use-2026-10-07/scoped-parity.json)
records **349,310 matching lines per JAR**, including live count mutations,
selection/offhand changes, equipment callbacks, flag dirty prefixes, completion
replacement and failed callbacks. Targeted Clippy passes. Item/level effects and
the equip/synchronized observers are controlled; starting use, default observer
reactions, consumables, kinetic combat, remainders/cooldowns and complete gameplay
integration remain pending.
`inventory_use::flags_updated` implements LivingEntity's synchronized use-flag
reaction. On clients, a using flag can select the held stack and query its
duration; clearing use can clear the active stack and remaining time. Server
notifications leave active-use state unchanged. Received assignments notify even
when the byte value is unchanged, while ordinary unchanged writes do not.
`python3 tools/test_use_flag_reaction_parity.py` invokes the inherited native
observer through actual synchronized writes/assignments, player inventory and
equipment. The [reaction report](../benchmarks/rust-use-flag-reaction-2026-10-07/scoped-parity.json)
records **366,331 matching lines per JAR**, including duration callbacks,
empty-but-distinct stack references, signed masks, repeated received values,
selection/count mutations and failures before dirty marking. Ordinary lifecycle
operations are also exercised with the real observer reaction. Targeted Clippy
passes. Other synchronized keys, start-use packet flow, full item/equip effects
and complete gameplay integration remain pending.
`inventory_use` now binds start-use to stored inventory, shared active stacks
and synchronized flag reactions. Server equipment synchronization precedes flag
writes, followed by start vibration and the kinetic-enemy reset service. Captured
stack/hand arguments and live state reads retain native callback ordering.
`python3 tools/test_inventory_use_start_parity.py` exercises inherited native
start-use with actual Inventory, PlayerEquipment and synchronized storage. The
[start report](../benchmarks/rust-inventory-use-start-2026-10-07/scoped-parity.json)
records **9,506 fixtures and 223,004 matching lines per JAR**, including native
equipment packet construction, observer reactions, callback mutations/failures
and clearing a populated kinetic-enemy map. Targeted Clippy passes. Packet
encoding/delivery, the full kinetic-enemy map and combat, complete item/equip
effects and full gameplay integration remain pending.
`item_template` implements immutable template construction, conversion from
stacks, count replacement with native reference identity, current-prototype
component lookup, creation and patch precedence. Strict validation checks
damageable/stackable incompatibility before contained components and top-level
size. A required component-schema service handles contained validation. Rejected
creations return canonical EMPTY; rejected applied patches restore the exact
previous raw patch, including redundant entries.
`python3 tools/test_item_template_parity.py` compares actual ItemStackTemplate
and ItemStack validation with scalar max-stack-size/max-damage/damage components.
The [template report](../benchmarks/rust-item-template-2026-10-07/scoped-parity.json)
records **518,556 matching lines per JAR**, covering zero/negative/overflow-edge
counts, changed prototypes, component removals, aliasing and validation rollback.
Targeted Clippy passes. Contained components and bundle-weight validation are
not exercised by this corpus; their schema implementation, codecs, use-remainder
integration and complete gameplay integration remain pending.
`use_remainder` converts a consumed stack using the validated item-template
factory. Infinite materials and unchanged visible counts retain the original
reference. An exhausted stack returns the created remainder; otherwise an extra
item callback runs and the captured original reference is returned. Callback
mutations and failures retain their native prefix.
`python3 tools/test_use_remainder_parity.py` compares actual UseRemainder with
native template creation. The
[remainder report](../benchmarks/rust-use-remainder-2026-10-07/scoped-parity.json)
records **353,264 matching lines per JAR**, including canonical EMPTY creation,
empty-but-distinct inputs, reference replacement and callback failures. Targeted
Clippy passes. The concrete actor inventory/drop handler, contained-component
validation, finish-use side effects and complete gameplay integration remain
pending.
`bundle_weight` implements checked native fraction construction, addition and
multiplication, nested-bundle overhead, occupied-beehive weight and lazy caching
of successful and failed weight calculations. Contained validation checks
container sizes, then bundle sizes and weight, then charged projectile sizes.
It does not recursively apply full strict validation to each contained item.
`python3 tools/test_bundle_weight_parity.py` compares pinned Fraction arithmetic,
actual BundleContents and ItemStack strict validation. The
[bundle report](../benchmarks/rust-bundle-weight-2026-10-07/scoped-parity.json)
records **137,332 matching lines per JAR**, including overflow, negative template
counts, changed prototypes, cached errors, nested bundles, bee presence, empty
component visibility and validation order. Targeted Clippy passes. Typed schema
adapters remain fixture-local; complete bundle inventory operations, codecs,
item-use integration and full gameplay integration remain pending.
`java_hash_map` supplies default-capacity storage for non-null keys with native
hash codes and a total comparable ordering consistent with equality. It retains
linked bucket traversal, tree-bin root movement, red/black insertion/deletion,
resize splits, iterator removal and structural-modification checks. Tree lookup
uses the ordered tree; removed arena slots are reused.
`python3 tools/test_java_hash_map_parity.py` compares this API with the actual
JDK 25 HashMap used by vanilla cooldown storage. The
[map report](../benchmarks/rust-java-hash-map-2026-10-07/scoped-parity.json) records
**601,084 matching lines** for each pinned-game classpath run, including all-key
collisions, tree/list transitions, varied removal orders, iterator mutations
and clear-on-empty behavior. Both runs use the same installed JDK; this is a
collection comparison, not a gameplay parity claim. Targeted Clippy passes.
Null/non-comparable keys, alternate map constructors and unexposed Map methods
are outside this storage API. Concrete cooldown and gameplay integration remain
pending.
`item_cooldowns` composes cooldown entries with native hash-map ordering. Adds
store before start notifications; removals notify even for missing groups. Tick
expiry removes before end notifications, rereads the live clock and preserves
iterator invalidation after callback mutations. Percentages use native wrapping
integer differences and float arithmetic. `identifier` supplies validated names,
Java hashes and path-first ordering. UseCooldown converts seconds and retrieves
the player cooldown manager before adding through the stack's current group.
`python3 tools/test_item_cooldowns_parity.py` compares actual ItemCooldowns and
UseCooldown over real stack components, with controlled player/start/end
callbacks. The
[cooldown report](../benchmarks/rust-item-cooldowns-2026-10-07/scoped-parity.json)
records **167,906 matching lines per JAR**, including colliding identifiers,
wrapping clocks, zero/negative durations, float edge cases, empty visibility,
reentrant ticks and mutation/failure prefixes. Targeted Clippy passes. Complete
item-finish integration, server cooldown packets and full gameplay remain
pending.
`item_after_use` composes shared stack copying, item completion, validated
remainder creation and cooldown application. The original stack is copied before
the item handler; remainder, cooldown and count are captured from that copy
before actor callbacks. The original copy reaches cooldown grouping even when
the item handler returns another stack. `use_remainder::convert_with` permits
creation and delivery to share the same mutable world without overlapping
borrows. Templates and component patches support structural value equality.
`python3 tools/test_item_after_use_parity.py` invokes actual
ItemStack.finishUsingItem and native remainder/template/cooldown implementations.
The [completion report](../benchmarks/rust-item-after-use-2026-10-07/scoped-parity.json)
records **211,804 matching lines per JAR**, including prototype changes, original
copies, empty aliases and mutations/failures at each effect boundary. The
[remainder regression](../benchmarks/rust-item-after-use-2026-10-07/remainder-regression.json)
retains **353,264 matching lines per JAR**. Targeted Clippy passes. Item handlers
and actor extra-item delivery remain controlled; concrete consumables, full
inventory-use binding, contained schemas and complete gameplay remain pending.
`extra_items::deliver` connects server-player remainder delivery to actual
inventory pickup. Failed insertion reaches the predicted drop service with the
same remaining stack; successful insertion retains native count consumption and
slot aliases. The drop service represents throwRandomly=false and
Prediction::PREDICTED.
`python3 tools/test_extra_items_parity.py` composes native item completion,
remainders and cooldowns with inherited ServerPlayer extra-item handling and
real Inventory/PlayerEquipment. The
[delivery report](../benchmarks/rust-extra-items-2026-10-07/scoped-parity.json)
records **272,124 matching lines per JAR**, including full/partially filled
inventories, offhand merging, aliased slots, creative material queries, partial
insertion and callback failures. Targeted Clippy passes. Drop arguments are
verified, but entity spawning remains controlled. Concrete item handlers, full
contained schemas, complete use lifecycle and full gameplay remain pending.
`food_properties` implements the food consumption listener with stored FoodData
and native random streams. It captures the actor's random source before the
first sound, updates hunger and saturation for players, then emits the burp
sound using the captured source and current position.
`python3 tools/test_food_properties_parity.py` compares actual
FoodProperties.onConsume with real FoodData and both native random generators.
The [food listener report](../benchmarks/rust-food-properties-2026-10-07/scoped-parity.json)
records **70,632 matching lines per JAR**, including player/non-player actors,
sound arguments, subsequent random state, changed food stores and positions,
and callback mutation/failure prefixes. Targeted Clippy passes. Sound playback,
complete consumable dispatch, particles/effects and full gameplay integration
remain pending.
`item_particles` emits eating particles from one retained ItemStackTemplate.
Each iteration reads the actor's direct random field and current rotations;
eye-height and level callbacks preserve native evaluation order. Component
mutations after capture do not alter the particle template.
`python3 tools/test_item_particles_parity.py` compares inherited
LivingEntity.spawnItemParticles with real templates and both native random
generators. The
[particle report](../benchmarks/rust-item-particles-2026-10-07/scoped-parity.json)
records **143,167 matching lines per JAR**, including exact position/velocity
bits, empty stacks, negative particle counts, snapshot identity, float edge
cases, random-source replacement and callback mutation/failure prefixes.
Targeted Clippy passes. The fixture uses scalar damage component patches and
controlled particle delivery; renderer enqueue, full consumable dispatch and
complete gameplay remain pending.
`consumable` supplies consumption timing and particle/sound dispatch. Both
eating and drinking pitch draws occur for every animation before particle
callbacks. Sound overrides run afterward; volume and pitch retain their
previously drawn values. Particle emission may use a different actor random
source from the one supplied for sound selection.
`python3 tools/test_consumable_emission_parity.py` composes actual Consumable
emission with inherited LivingEntity particles and real item templates. The
[consumable emission report](../benchmarks/rust-consumable-emission-2026-10-07/scoped-parity.json)
records **124,732 matching lines per JAR**, covering all animations, timing
overflow and float edges, random-source aliases, optional particles, sound
overrides and callback mutation/failure prefixes. Targeted Clippy passes. Sound
playback, rendering, consumable completion/effects and full gameplay remain
pending.
`consumable` now also runs eligibility, immediate/timed start and completion.
Completion captures its random source before emission, selects the current item
for server statistics, dispatches live component listeners, then runs server
effects, the game event and finite-material stack shrink in native order. The
same input stack is returned even when callbacks empty it. Timed starts return
CONSUME without a transformed stack; immediate starts return that stack.
`python3 tools/test_consumable_parity.py` compares actual Consumable methods
with concrete FoodProperties/FoodData, inherited particles, shared stacks and
both native random generators. The
[consumption report](../benchmarks/rust-consumable-2026-10-07/scoped-parity.json)
records **246,033 matching lines per JAR**, covering player/non-player/server
branches, food component changes, stat item selection, empty advancement trigger
storage, client/server effects, game events, creative material queries and
mutation/failure prefixes. Targeted Clippy passes. Eligibility and start-use
callbacks, statistics, effect bodies and event delivery remain controlled;
listener enumeration here binds the ordinary food schema. Full advancement
evaluation, potion effects, entity/world lifecycle integration and playable
gameplay remain pending.
`status_effect` stores shared MobEffectInstance identity, scalar details, hidden
chains and blend state. Native copies retain scalar details while omitting hidden
effects and resetting blend state. Stronger/longer effect updates preserve
hidden-chain aliases and native change flags. Duration mapping skips zero and
infinite durations; scaling uses the pinned version's floor and narrowing rules.
`python3 tools/test_status_effect_parity.py` compares actual constructors,
copy/update operations, duration mapping/scaling, equality and blend copying.
The [status storage report](../benchmarks/rust-status-effect-2026-10-07/scoped-parity.json)
records **655,643 matching lines per JAR**, covering constructor clamping, raw
amplifiers, shared hidden chains, negative/overflow/infinite durations, float
edges and mapper mutation/failure behavior. Equality excludes hidden and blend
state as in vanilla. Mismatched-holder warning logs are outside the comparison.
Server/client ticking, concrete effect behavior, registries and full entity
integration remain pending.
`consume_effect` implements apply-status, remove-status, clear-status and sound
consumption effects. Applying status effects draws probability even for an empty
list, creates fresh native-style instance copies and visits every entry without
short-circuiting on success. Removal preserves holder order and duplicates;
sound playback captures block position before querying the actor's category.
`python3 tools/test_consume_effect_parity.py` compares the four actual native
consume-effect classes with real effect instances and random generators. The
[consume-effect report](../benchmarks/rust-consume-effect-2026-10-07/scoped-parity.json)
records **184,437 matching lines per JAR**, including NaN/probability edges,
copy identity/details, hidden/blend resets, shared input mutation, return-value
aggregation, sound arguments and callback failure prefixes. Targeted Clippy
passes. Actor status add/remove/clear and sound delivery remain controlled;
named holder-set rebinding, teleport consumption and full gameplay integration
remain pending.
`teleport_consume` implements random-teleport consumption, including the
16-attempt limit, coordinate/random evaluation order, logical-height bounds,
dismounting and post-success effects. Successful teleports emit the game event,
class-specific sound and optional packed directional-particle event before
resetting fall distance and impulse context.
`python3 tools/test_teleport_consume_parity.py` compares actual
TeleportRandomlyConsumeEffect with both native random generators, ordinary and
fox actor classes, native offset packing and fall/impulse reset bodies. The
[teleport consumption report](../benchmarks/rust-teleport-consume-2026-10-07/scoped-parity.json)
records **282,010 matching lines per JAR**, including exact candidates and
subsequent random state, height overflow, float edges, attempt exhaustion,
captured/live positions and callback mutation/failure prefixes. Targeted Clippy
passes. Destination validation and teleporting, passenger links and world event
delivery remain controlled services; full gameplay integration remains pending.
`status_effect` also implements server/client ticking and client blend updates.
Hidden instances count down with their parent. When the active duration reaches
zero, the hidden details are restored before the server downgrade callback.
Infinite effects use the actor's tick count for scheduling. Blend updates retain
native callback/read ordering, duration-dependent steps and interpolation.
`python3 tools/test_status_tick_parity.py` compares actual MobEffectInstance
ticks, skipBlending and getBlendFactor with controlled MobEffect callbacks. The
[status tick report](../benchmarks/rust-status-tick-2026-10-07/scoped-parity.json)
records **412,552 matching lines per JAR**, including shared hidden chains,
zero/negative/infinite durations, raw amplifiers, early application failures,
downgrade notifications, blend float edge cases, removed actors and callback
mutation/failure prefixes. Targeted Clippy passes. Registered effect behaviors,
entity effect maps, UI rendering and full gameplay remain pending.
`java_hash_map` now supports non-comparable keys, unequal keys whose comparable
ordering returns zero, and the native map-copy constructor. Lookup searches
ambiguous tree branches; tree insertion uses class/identity tie-breaking. Copies
size their table from the source count before insertion, retaining shared values
while allowing the resulting bucket order to differ.
`python3 tools/test_java_identity_map_parity.py` compares actual JDK 25 HashMap
operations and copies across mixed key classes. Each Java process exports its
actual identity hashes for Rust to use in that same scenario. The
[identity/copy report](../benchmarks/rust-java-identity-map-2026-10-07/scoped-parity.json)
records **577,200 matching lines per classpath run**. The
[ordered-key regression](../benchmarks/rust-java-identity-map-2026-10-07/ordered-map-regression.json)
retains **601,084 matching lines**, and the
[cooldown regression](../benchmarks/rust-java-identity-map-2026-10-07/cooldown-regression.json)
retains **167,906 matching lines per JAR**. Targeted Clippy passes. Map-only runs
use the same installed JDK; these comparisons do not assert gameplay parity or
equal identity hashes across processes. Keys must have pure operations; null
keys and other unexposed Map APIs remain outside this storage subset.
`PlayerAttributeHealth`, `ServerPlayerDamage` and `ServerPlayerCombat` can now
borrow `LiveAttributes`, the same storage used by the resident moving player,
as well as `EntityAttributes`. Health limits and armor queries use the borrowed
store; equipment damage callbacks can update it before damage reduction reads
armor and toughness. Player absorption retains synchronized float storage.
The [live player combat comparison](../benchmarks/rust-live-player-combat-2026-10-07/scoped-parity.json)
runs the identical corpus through both stores and matches 1,176,994 output lines
against each pinned Java reference. It covers repeated hits, cooldowns, health
and absorption writes, exhaustion, numeric edges, armor mutation during a hit
and callback failures. Equipment, attribution, death services and other world
consumers retain the controlled boundaries documented in the report. Connecting
this binding to the resident client landing consumer remains the next step.