mirror of
https://github.com/horizon-rust/horizon.git
synced 2026-11-07 11:06:11 -10:00
Compare commits
310
Commits
parity/blocks
...
menus
No files matched your search
+22
-15
@@ -8,12 +8,7 @@ permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
verify:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Linux only. macOS only when started by hand: gh workflow run checks --ref <branch>.
|
||||
os: ${{ fromJSON(github.event_name == 'workflow_dispatch' && '["ubuntu-latest", "macos-26"]' || '["ubuntu-latest"]') }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -27,14 +22,30 @@ jobs:
|
||||
python tools/check_public_tree.py --history
|
||||
- name: Test offline research tooling
|
||||
run: python -m unittest discover -s tests -v
|
||||
- name: Install Rust toolchain
|
||||
run: rustup toolchain install stable --profile minimal --component rustfmt --component clippy
|
||||
- name: Install Rust toolchain and the ALSA headers the client's audio links against
|
||||
run: |
|
||||
sudo apt-get update && sudo apt-get install -y --no-install-recommends libasound2-dev
|
||||
rustup toolchain install stable --profile minimal --component rustfmt --component clippy
|
||||
- name: Check formatting and lint
|
||||
run: |
|
||||
cargo +stable fmt --all -- --check
|
||||
cargo +stable clippy --workspace --all-targets -- -D warnings
|
||||
- name: Test Rust core and voxel kernel correctness
|
||||
run: cargo +stable test --workspace
|
||||
# Horizon never downloads the game. These jobs need a self-hosted Linux runner
|
||||
# (label horizon-game) holding the maintainer's own copy: the official launcher's
|
||||
# game directory in HORIZON_MINECRAFT_DIR and the pinned server jar in
|
||||
# HORIZON_SERVER_JAR. Start them by hand: gh workflow run checks --ref <branch>.
|
||||
vanilla-parity:
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
runs-on: [self-hosted, linux, horizon-game]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- name: Install Rust toolchain
|
||||
run: rustup toolchain install stable --profile minimal
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
@@ -374,12 +385,8 @@ jobs:
|
||||
RUSTUP_TOOLCHAIN: stable
|
||||
run: python tools/test_float_log_parity.py
|
||||
portable-mod:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Linux only. macOS only when started by hand: gh workflow run checks --ref <branch>.
|
||||
os: ${{ fromJSON(github.event_name == 'workflow_dispatch' && '["ubuntu-latest", "macos-26"]' || '["ubuntu-latest"]') }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
runs-on: [self-hosted, linux, horizon-game]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
@@ -466,7 +473,7 @@ jobs:
|
||||
- name: Upload original mod and pack manifests only
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: horizon-${{ matrix.os }}
|
||||
name: horizon-linux
|
||||
path: |
|
||||
dist/*.mrpack
|
||||
dist/horizon-*.jar
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
name: launcher
|
||||
# Builds the launcher on Linux, macOS and Windows. A pushed `launcher-vX.Y.Z` tag also puts the
|
||||
# three archives on a draft GitHub release of that tag, to publish by hand. Horizon's own
|
||||
# releases are tagged `vYYYY.MM.DD`; the launcher reads only `launcher-v*` releases for itself.
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [launcher]
|
||||
tags: ['launcher-v*']
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
asset: horizon-launcher-linux-x86_64.tar.gz
|
||||
binary: horizon-launcher
|
||||
- os: macos-latest
|
||||
asset: horizon-launcher-macos-arm64.zip
|
||||
binary: horizon-launcher
|
||||
- os: windows-latest
|
||||
asset: horizon-launcher-windows-x64.zip
|
||||
binary: horizon-launcher.exe
|
||||
runs-on: ${{ matrix.os }}
|
||||
defaults:
|
||||
run:
|
||||
working-directory: launcher
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: launcher
|
||||
- name: Linux libraries GPUI links to
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libxkbcommon-x11-dev libwayland-dev libx11-xcb-dev libfontconfig-dev libvulkan-dev libasound2-dev
|
||||
- name: The tag matches Cargo.toml
|
||||
if: startsWith(github.ref, 'refs/tags/launcher-v')
|
||||
run: grep -qx "version = \"${GITHUB_REF_NAME#launcher-v}\"" Cargo.toml
|
||||
- run: cargo test --release --locked --lib
|
||||
- run: cargo build --release --locked
|
||||
- name: Package
|
||||
run: |
|
||||
mkdir -p dist
|
||||
cp target/release/${{ matrix.binary }} dist/
|
||||
cd dist
|
||||
if [[ "${{ matrix.asset }}" == *.tar.gz ]]; then
|
||||
tar czf ../${{ matrix.asset }} ${{ matrix.binary }}
|
||||
elif [[ "$RUNNER_OS" == "Windows" ]]; then
|
||||
7z a ../${{ matrix.asset }} ${{ matrix.binary }}
|
||||
else
|
||||
zip ../${{ matrix.asset }} ${{ matrix.binary }}
|
||||
fi
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.asset }}
|
||||
path: launcher/${{ matrix.asset }}
|
||||
|
||||
release:
|
||||
if: startsWith(github.ref, 'refs/tags/launcher-v')
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: dist
|
||||
merge-multiple: true
|
||||
# A draft, and never marked latest: Horizon's own releases stay the repository's latest.
|
||||
- uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ github.ref_name }}
|
||||
name: Horizon launcher ${{ github.ref_name }}
|
||||
draft: true
|
||||
make_latest: false
|
||||
files: dist/*
|
||||
@@ -1,46 +0,0 @@
|
||||
name: macOS shader research
|
||||
on:
|
||||
workflow_dispatch:
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
shader-worlds:
|
||||
runs-on: macos-26
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '25'
|
||||
- name: Build original mod and private probe dependencies
|
||||
run: python tools/build_mod.py
|
||||
- name: Verify required cinematic shaders in OpenGL and Vulkan worlds
|
||||
run: |
|
||||
python - <<'PY'
|
||||
import json, subprocess, sys
|
||||
from pathlib import Path
|
||||
observations = []
|
||||
for backend in ['opengl', 'vulkan']:
|
||||
case = ['--profile', 'cinematic', '--backend', backend, '--world', '--shaders']
|
||||
result = subprocess.run([sys.executable, 'tools/test_client_graphics.py', '--native-display', *case], capture_output=True, text=True)
|
||||
print(result.stdout, end='', flush=True)
|
||||
print(result.stderr, end='', flush=True)
|
||||
observation = {'case': case, 'exit_code': result.returncode}
|
||||
if result.returncode:
|
||||
marker = 'HORIZON_FIXTURE_FAILURE '
|
||||
observation['failure'] = [json.loads(line.split(marker, 1)[1]) for line in result.stdout.splitlines() if marker in line]
|
||||
else:
|
||||
observation['report'] = json.loads(Path('dist/client-graphics-smoke.json').read_text())
|
||||
observations.append(observation)
|
||||
Path('dist/client-graphics-shader-research.json').write_text(json.dumps(observations, indent=2) + '\n')
|
||||
sys.exit(int(any(item['exit_code'] for item in observations)))
|
||||
PY
|
||||
- name: Retain selected observations including failed cases
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-shader-observations
|
||||
path: dist/client-graphics-shader-research.json
|
||||
@@ -1,59 +0,0 @@
|
||||
name: macOS Vulkan research
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
world:
|
||||
description: Create or open disposable demo worlds instead of title probes
|
||||
type: boolean
|
||||
default: false
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
native-probes:
|
||||
runs-on: macos-26
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '25'
|
||||
- name: Build original mod and private probe dependencies
|
||||
run: python tools/build_mod.py
|
||||
- name: Probe vanilla, core and distant-terrain Vulkan cases
|
||||
env:
|
||||
HORIZON_GRAPHICS_WORLD: ${{ inputs.world }}
|
||||
run: |
|
||||
python - <<'PY'
|
||||
import json, os, subprocess, sys
|
||||
from pathlib import Path
|
||||
cases = [
|
||||
['--profile', 'baseline', '--backend', 'vulkan'],
|
||||
['--profile', 'core-performance', '--backend', 'vulkan'],
|
||||
['--profile', 'vulkan'],
|
||||
]
|
||||
if os.environ.get('HORIZON_GRAPHICS_WORLD') == 'true':
|
||||
cases = [case + ['--world'] for case in cases]
|
||||
observations = []
|
||||
for case in cases:
|
||||
result = subprocess.run([sys.executable, 'tools/test_client_graphics.py', '--native-display', *case], capture_output=True, text=True)
|
||||
print(result.stdout, end='', flush=True)
|
||||
print(result.stderr, end='', flush=True)
|
||||
observation = {'case': case, 'exit_code': result.returncode}
|
||||
if result.returncode:
|
||||
marker = 'HORIZON_FIXTURE_FAILURE '
|
||||
observation['failure'] = [json.loads(line.split(marker, 1)[1]) for line in result.stdout.splitlines() if marker in line]
|
||||
else:
|
||||
observation['report'] = json.loads(Path('dist/client-graphics-smoke.json').read_text())
|
||||
observations.append(observation)
|
||||
Path('dist/client-graphics-vulkan-research.json').write_text(json.dumps(observations, indent=2) + '\n')
|
||||
sys.exit(int(any(item['exit_code'] for item in observations)))
|
||||
PY
|
||||
- name: Retain selected observations including failed cases
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-vulkan-observations
|
||||
path: dist/client-graphics-vulkan-research.json
|
||||
@@ -0,0 +1,27 @@
|
||||
name: release builds
|
||||
# Started by hand: gh workflow run release.yml --ref <branch>
|
||||
# Builds the Windows x64 client and uploads the playable folder as an artifact.
|
||||
# Linux and macOS builds are made on the development machines.
|
||||
on:
|
||||
workflow_dispatch:
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install Rust toolchain
|
||||
run: rustup toolchain install stable --profile minimal
|
||||
- name: Build the client
|
||||
# The C runtime linked in, so the game runs without the Visual C++ redistributable.
|
||||
env:
|
||||
RUSTFLAGS: -C target-feature=+crt-static
|
||||
run: cargo +stable build --release --locked -p horizon-client --bin horizon-client
|
||||
- name: Package
|
||||
shell: bash
|
||||
run: packaging/package.sh target/release/horizon-client.exe dist/horizon-windows-x64
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: horizon-windows-x64
|
||||
path: dist/horizon-windows-x64
|
||||
@@ -16,3 +16,5 @@
|
||||
/dist/
|
||||
/mods/horizon/build/
|
||||
/saves/
|
||||
/tools/logs/
|
||||
.DS_Store
|
||||
Generated
+9
@@ -681,12 +681,14 @@ dependencies = [
|
||||
name = "horizon-client"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"ab_glyph",
|
||||
"bytemuck",
|
||||
"cpal",
|
||||
"glam",
|
||||
"horizon-assets",
|
||||
"horizon-core",
|
||||
"horizon-protocol",
|
||||
"horizon-theme",
|
||||
"horizon-world",
|
||||
"miniz_oxide 0.8.9",
|
||||
"png",
|
||||
@@ -700,6 +702,9 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "horizon-core"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "horizon-protocol"
|
||||
@@ -710,6 +715,10 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "horizon-theme"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "horizon-world"
|
||||
version = "0.1.0"
|
||||
|
||||
+2
-1
@@ -1,5 +1,6 @@
|
||||
[workspace]
|
||||
members = ["crates/horizon-core", "crates/horizon-world", "crates/voxel-kernels", "crates/horizon-client", "crates/horizon-assets", "crates/horizon-protocol"]
|
||||
exclude = ["launcher"]
|
||||
members = ["crates/horizon-core", "crates/horizon-world", "crates/voxel-kernels", "crates/horizon-client", "crates/horizon-assets", "crates/horizon-protocol", "crates/horizon-theme"]
|
||||
resolver = "2"
|
||||
|
||||
[workspace.package]
|
||||
|
||||
@@ -1,337 +1,176 @@
|
||||
<p align="center">
|
||||
<img src="docs/media/banner.jpg" alt="Horizon: Minecraft Java Edition 26.3, rewritten from scratch in Rust" width="100%">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/ludovic111/horizon/actions/workflows/ci.yml"><img src="https://github.com/ludovic111/horizon/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
|
||||
<img src="https://img.shields.io/badge/Minecraft-Java%2026.3-5D9C3F" alt="Minecraft Java 26.3">
|
||||
<img src="https://img.shields.io/badge/Rust-stable-B7410E?logo=rust&logoColor=white" alt="Rust">
|
||||
<img src="https://img.shields.io/badge/vanilla%20parity-100%25-F0795A" alt="Vanilla parity 100%">
|
||||
<img src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-2A2470" alt="Linux, macOS and Windows">
|
||||
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-3B2F7E" alt="MIT license"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#download"><b>Download</b></a> ·
|
||||
<a href="#screenshots"><b>Screenshots</b></a> ·
|
||||
<a href="#project-status"><b>Parity status</b></a> ·
|
||||
<a href="docs/README.md"><b>Documentation</b></a>
|
||||
</p>
|
||||
|
||||
# Horizon
|
||||
|
||||
Horizon is a Rust rewrite of Minecraft Java **26.3** targeting one-to-one vanilla gameplay parity, alongside client performance research. Not affiliated with Mojang or Microsoft.
|
||||
A Rust rewrite of Minecraft: Java Edition 26.3 built for one-to-one vanilla parity, checked against the game itself with differential tests.
|
||||
|
||||
Every subsystem matches vanilla in all 281 parity harnesses, on Linux and macOS: 100% of what the harnesses compare (see [Project status](#project-status)). The native client is playable on Linux, macOS (Apple Silicon) and Windows.
|
||||
|
||||
> Not an official Minecraft product. Not approved by or associated with Mojang or Microsoft. Horizon contains no Minecraft code, assets or data: you need your own legally obtained copy of Minecraft: Java Edition 26.3.
|
||||
|
||||
## Download
|
||||
|
||||
**[Download the Horizon launcher](https://github.com/ludovic111/horizon/releases?q=launcher-v&expanded=true)** for Linux x86-64, macOS Apple Silicon or Windows x64: take the newest `launcher-v*` release (currently [launcher-v0.1.1](https://github.com/ludovic111/horizon/releases/tag/launcher-v0.1.1)); the launcher then updates itself. The launcher is the way to get Horizon: it installs and updates the game, prepares its resources from your own copy of Minecraft, and starts the client or a dedicated server.
|
||||
|
||||
**You need** Minecraft: Java Edition installed with the official launcher, with 26.3 played once; Python 3.10 or newer and Java 25 (a JDK, e.g. Eclipse Temurin 25) for the one-time resource preparation; and a GPU with Vulkan on Linux and Windows, or any Apple Silicon Mac.
|
||||
|
||||
### The launcher
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%"><img src="launcher/docs/play.png" alt="The launcher's Play page"></td>
|
||||
<td width="50%"><img src="launcher/docs/versions.png" alt="The launcher's Versions page"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
It lists Horizon's releases and installs the build for your platform, shows each release's patch notes and the roadmap, updates Horizon and itself, and doubles as a command-line tool and an MCP server. See [the launcher's README](launcher/README.md).
|
||||
|
||||
## Screenshots
|
||||
|
||||
Captured in the Rust client itself, with vanilla assets and no mods or shaders.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td colspan="2"><img src="docs/media/sunset.jpg" alt="Sunset over a savanna river valley and a plains village"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%"><img src="docs/media/village.jpg" alt="A plains village with farms, an iron golem and animals"></td>
|
||||
<td width="50%"><img src="docs/media/survival.jpg" alt="Survival at dusk: a zombie attacks near the village"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%"><img src="docs/media/nether.jpg" alt="A crimson forest in the Nether with a zombified piglin"></td>
|
||||
<td width="50%"><img src="docs/media/night.jpg" alt="Moonrise over a torch-lit village and river"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%"><img src="docs/media/underwater.jpg" alt="Salmon swimming in a river"></td>
|
||||
<td width="50%" valign="middle">
|
||||
Vanilla world generation ported to Rust (terrain, aquifers, carvers, features, villages and the Nether), every block model with smooth lighting and biome tints, the vanilla sky and fog, mobs, the HUD, chat and advancements: everything in these frames is drawn by Horizon.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## What it does
|
||||
|
||||
Horizon reimplements the Minecraft Java client and its game logic in Rust, one subsystem at a time, and compares each piece with the vanilla game. Each `tools/test_*_parity.py` harness drives the same inputs through Horizon and through the vanilla client and server bytecode from your own copy of the game, then checks that the outputs are identical. It is for players and developers interested in game reimplementation, and for anyone who wants to see how far a behaviour-exact native rewrite can go.
|
||||
|
||||
The [native client](docs/native-client.md) opens on a vanilla-style title screen with world creation and selection, and generates worlds with the Rust port of the vanilla generators: noise terrain, aquifers, surface rules, carvers and placed features, all checked against vanilla. It streams and lights chunks on worker threads and renders every vanilla block model with smooth lighting, biome tints, the vanilla sky, sun, moon, stars and clouds. Gameplay includes:
|
||||
|
||||
**The Rust game is now playable.** The [native client](docs/native-client.md) opens on a vanilla-style title screen with world creation and selection, and generates worlds with the Rust port of the vanilla overworld generator: noise terrain, aquifers, surface rules, carvers, and the placed features ported so far, all checked against vanilla. It streams and lights chunks on worker threads and renders every vanilla block model with smooth lighting, biome tints, the vanilla sky, sun, moon, stars and clouds. Gameplay so far:
|
||||
- validated player physics, health and hunger;
|
||||
- mining with vanilla tool rules and loot tables;
|
||||
- placing, crafting, chests and furnaces;
|
||||
- dropped items and particles;
|
||||
- sounds;
|
||||
- passive and hostile mobs with combat, including guardians, shulkers, illagers, ravagers, the wither and the ender dragon fight;
|
||||
- villagers that take jobs, trade, restock, meet at the bell and sleep in beds;
|
||||
- dropped items, particles and sounds;
|
||||
- passive and hostile mobs with combat and vanilla AI, including guardians, shulkers, illagers, ravagers, the wither, the ender dragon fight, the breeze, the creaking, the sniffer, the happy ghast, llamas and the copper golem;
|
||||
- villagers that take jobs, trade, restock, meet at the bell and sleep in beds, on a port of vanilla's brain;
|
||||
- raids and pillager patrols;
|
||||
- dispensers, crafters, the loom and the recipe book;
|
||||
- every command, scoreboards and teams, the player list, subtitles and the HUD overlays;
|
||||
- boats, minecarts, item frames, paintings and armor stands;
|
||||
- shields, maps, books, fireworks, beacons, advancements and statistics;
|
||||
- Anvil saves.
|
||||
- Anvil saves, joining vanilla servers, and opening a world to LAN.
|
||||
|
||||
Parity is **not** complete. Still missing: the warden and the sculk family, the breeze, sniffer, creaking, happy ghast, llamas and a few other mobs, raids and pillager patrols, villager breeding and gossip, the loom, crafter and recipe book, scoreboards, subtitles, and spawned mob gear enchantments. Multiplayer joins vanilla servers but Horizon cannot host one. See [Rust rewrite status](docs/rust-parity.md).
|
||||
## Build from source
|
||||
|
||||
### Java parity: 84%
|
||||
For developers. Requirements: Rust 1.90 or newer, Python 3.10 or newer, JDK 25, and on Linux the ALSA development headers (`libasound2-dev` on Debian and Ubuntu). Development and the vanilla harnesses run on Linux.
|
||||
|
||||
Horizon contains no game files and never downloads them. It builds its resources from **your own copy** of Minecraft: Java Edition 26.3, verified against the checksums in `research-lock.json`:
|
||||
|
||||
1. **Client:** install Java Edition with the official launcher and play 26.3 once. Horizon reads `versions/26.3/`, `libraries/` and `assets/` from the launcher's game directory (`~/.minecraft` on Linux). If yours lives elsewhere, pass `--minecraft-dir` or set `HORIZON_MINECRAFT_DIR`.
|
||||
2. **Server jar:** the 26.3 server jar, from the `downloads.server.url` in your launcher's `versions/26.3/26.3.json` (or [minecraft.net/download/server](https://www.minecraft.net/en-us/download/server) while 26.3 is the current release). Pass it with `--server-jar` or set `HORIZON_SERVER_JAR`. It is only needed the first time.
|
||||
|
||||
```sh
|
||||
git clone https://github.com/ludovic111/horizon.git
|
||||
cd horizon
|
||||
python3 tools/prepare_native_client.py --prepare --server-jar ~/Downloads/server.jar # needs JDK 25
|
||||
python3 tools/fetch_sounds.py # optional: sounds from your launcher install
|
||||
cargo run --release -p horizon-client
|
||||
```
|
||||
|
||||
Everything prepared lands in the gitignored `.local/`. It is derived from the game: never commit it or share it.
|
||||
|
||||
The client starts on the title screen. Command-line options (`--world`, `--seed`, `--creative`, `--render-distance`, `--dedicated`), controls, scripting through `horizon-ctl`, and the architecture are described in [the native client guide](docs/native-client.md). The rest of the documentation is indexed in [docs/README.md](docs/README.md), including [the parity workflow](docs/parity-workflow.md).
|
||||
|
||||
## Project status
|
||||
|
||||
The table below is the project's own audit of each subsystem. Every subsystem now matches vanilla in every harness that compares it. 100% means 100% of what the harnesses compare, not proof that nothing else differs. The remaining known differences and the final checks are listed in the roadmap.
|
||||
|
||||
### Java parity: 100%
|
||||
|
||||
Each subsystem scores 0 (absent), 0.25 (started, not playable), 0.5 (playable,
|
||||
major vanilla features missing), 0.75 (playable, mostly complete) or 1 (complete
|
||||
and verified against vanilla by differential tests). The percentage is the
|
||||
average; `tests/test_parity.py` keeps it in sync with this table. Last audited
|
||||
2026-10-10 against the code, not the docs. The harnesses that failed in the
|
||||
previous audit (block updates, random ticks, redstone, command parsing, menu
|
||||
clicks, whole chunks, entity models and item models) now pass; the save
|
||||
round-trip harness has not been rerun.
|
||||
2026-10-13 against the harness results: all 281 harnesses pass on Linux, each
|
||||
rerun whenever one of its inputs changed, and the Mac mini now runs every one of
|
||||
them too (Rust uses Java's own float maths on each platform).
|
||||
|
||||
| Subsystem | Score | Main gaps |
|
||||
| --- | ---: | --- |
|
||||
| Window, input and game loop | 0.75 | Game loop and options match vanilla; camera, auto-jump, toggle sprint/sneak and the frame limiter not compared |
|
||||
| Assets and resources | 0.75 | Item models match vanilla over 196,290 stacks, but the client does not draw items through that pipeline yet; no pack screen |
|
||||
| Network protocol and multiplayer | 0.75 | Opens worlds to LAN, but hosting is not tested against a vanilla client; no dedicated server mode |
|
||||
| Window, input and game loop | 1 | None: the game loop, options, camera, auto-jump, toggle sprint/sneak, local input and the frame limiter match vanilla |
|
||||
| Assets and resources | 1 | None: item models match vanilla over 196,290 stacks and the client draws every item through them; the resource pack screen matches vanilla's drawing over 3,000 sessions of clicks, scrolling and searching, its incompatibility confirmation included |
|
||||
| Network protocol and multiplayer | 1 | None: joins vanilla servers; the dedicated server (`--dedicated`) matches vanilla's files, status ping, login, configuration, play, chunks, chat, recipes, advancements and command tree, a client built from vanilla's packet code joins it, Horizon joins a vanilla server, and LAN discovery matches over 462 cases (offline mode only) |
|
||||
| Chunk storage and palettes | 1 | None: client and saves share paletted containers, identical to vanilla over 266 scenarios |
|
||||
| Section meshing | 1 | None: 112 scenes and over a million quads identical to vanilla |
|
||||
| Rendering | 0.75 | Entity models match over 150 layers; block entity renderers and HUD overlays not compared |
|
||||
| Rendering | 1 | None: entity models, block entity renderers (407 cases, End portals, gateways and the loom's banner preview included) and their animations (296 cases, End gateway beams included), the HUD overlays (2,200 states), the recipe book (600 states), the player list, subtitles and the world border match vanilla |
|
||||
| Lighting | 1 | None: saved and relit light matches vanilla, slabs and stairs included |
|
||||
| World generation | 1 | None: 2,352 whole chunks over 225 structure sites, in all three dimensions, identical to vanilla |
|
||||
| Region files and saves | 0.75 | Save round-trip harness fails; older DataVersions are not upgraded |
|
||||
| Entities and physics | 0.75 | Attributes, dimensions, death loot, spawn rules and natural spawning (15,500 NaturalSpawner cases) match; AI not compared; drowned, villagers, traders and the wither unverified |
|
||||
| Interaction and inventory | 1 | None: menu clicks match over 6,000 click sequences |
|
||||
| Menus, HUD and chat | 0.75 | Commands parse as vanilla over 39,685 inputs, but /item modify, /spectate, /waypoint and /dialog do not run; no tab list or world border rendering |
|
||||
| Audio | 0.75 | Sound engine, music and ambience not compared with vanilla |
|
||||
| Block behaviours and ticking | 0.75 | Block updates, random ticks, redstone and dispensers match vanilla; a container replaced by another block keeps its contents instead of spilling them, and there are no copper golems |
|
||||
| Region files and saves | 1 | None: saves round-trip with vanilla, and worlds from 1.8 to 26.2 upgrade as vanilla's DataFixers do, superflat worlds included; old options.txt and hotbar.nbt files are upgraded too |
|
||||
| Entities and physics | 1 | None: attributes, dimensions, death loot, spawn rules, natural spawning (15,500 cases), raids and patrols (1,900 cases), spawned mobs' gear, enchantments and state (`finalizeSpawn`, 24,000 cases) and mob AI (92 scenarios: villager breeding and gossip, the warden, ghastlings and copper golems included) match vanilla |
|
||||
| Interaction and inventory | 1 | None: menu clicks match over 8,000 click sequences, the loom and the crafter included; recipe book placement (6,000 cases), its buttons (1,200), the saved book (1,500) and the loom and crafter screens (1,600) match vanilla |
|
||||
| Menus, HUD and chat | 1 | None: every command runs as vanilla (758 commands over 39,685 parsed inputs), scoreboards and teams match (81,000 operations), the player list matches over 872,000 draw calls with heads drawn from players' skins (authlib's textures, SkinManager's lookup, legacy skin conversion), and the chat matches focused and scrolled; the resource pack screen (selection over 4,000 cases, drawing and its incompatibility confirmation over 3,000 sessions) and the chat input with its command suggestions, usage lines, Tab completion and history (3,000 sessions on vanilla's client command tree) match vanilla |
|
||||
| Audio | 1 | None: the sound engine, sound events, music, situational music, ambience and subtitles match vanilla |
|
||||
| Block behaviours and ticking | 1 | None: block updates, random ticks, redstone, dispensers (6,000 cases), crafters (4,000 crafts), block entity removal (containers spill, 4,000 cases), copper golem chest sorting and the sculk family (435 scenarios: shrieker warnings and warden summoning included) match vanilla |
|
||||
|
||||
### Next steps
|
||||
### Roadmap
|
||||
|
||||
1. Rerun the save round-trip harness and upgrade saves from older DataVersions.
|
||||
2. Draw every item through the item model pipeline, and add the resource pack screen.
|
||||
3. An audio harness: sound engine attenuation, weighted sound events, music and ambience.
|
||||
4. A mob AI harness, and an oracle for drowned, villagers, traders and the wither.
|
||||
5. The missing commands, containers spilling when replaced, copper golems, the tab list and world border rendering.
|
||||
6. Test LAN hosting with a vanilla client, and add a dedicated server mode.
|
||||
**Known differences.** Online-mode servers (Mojang's session servers) are not supported; skins served over https show the default skin unless already cached; pack icons show the unknown-pack texture in game; the creative hotbar keys (C/X) aren't wired to the hotbar loader; item tooltips lack attribute lines.
|
||||
|
||||
**Final checks.** A from-scratch audit (`tools/parity.py --all`) on Linux and on macOS, and the launch checks on the packaged Linux, macOS and Windows builds listed in [Rust rewrite status](docs/rust-parity.md#completion-criteria-and-playable-builds).
|
||||
|
||||
**Next.** With vanilla parity as the base:
|
||||
|
||||
- **Performance:** optimize the client and the server as far as they can go (rendering, chunk generation and meshing, memory, multithreaded ticking) while the differential harnesses keep gameplay identical to vanilla.
|
||||
- **Modding support:** a stable API for writing mods against Horizon.
|
||||
- **Agent control:** an MCP server and a CLI so AI agents and scripts can play and drive the game, growing out of today's `horizon-ctl` scripting socket.
|
||||
- **Built-in recording:** capture gameplay video in a keypress, without external tools.
|
||||
- **Automatic version updates:** a pipeline that ports each new Minecraft release on its own: compare the new version with the pinned one, regenerate the data, rewrite the changed parts and prove them with the same differential harnesses.
|
||||
|
||||
## Contributing
|
||||
|
||||
Issues and pull requests are welcome. Before opening a pull request, run the offline checks:
|
||||
|
||||
```sh
|
||||
python3 tools/prepare_native_client.py --prepare # needs JDK 25; extracts private vanilla resources
|
||||
python3 tools/fetch_sounds.py # optional: vanilla sounds
|
||||
cargo run --release -p horizon-client
|
||||
```
|
||||
|
||||
**Target machine:** the Rust rewrite targets one machine, **ludodesktop**: Ubuntu 26.04, Intel i7-13700KF, NVIDIA RTX 4080, GNOME on Wayland. The final deliverable is a playable native Linux build validated there. macOS (including the M2 Pro Mac) and Windows are out of scope. Track implementation and acceptance criteria in [Rust rewrite status](docs/rust-parity.md).
|
||||
|
||||
**Java performance packs (no longer developed):** the earlier track of pinned Java performance packs, distant terrain, an original frame/tick recorder and client/server starter downloads. No release downloads are published; build the packs and starters locally with `python3 tools/build_release.py` (see [Build and run](#build-and-run)). They are no longer a development target.
|
||||
|
||||
## Java packs: Mac starter (out of scope)
|
||||
|
||||
Build **horizon-mac-starter-0.21.0.zip** with `python3 tools/build_release.py` (it lands in `dist/`), extract it and open `Mac-Start.command`. It verifies and installs official universal Prism Launcher in `~/Applications` if needed, then opens the balanced pack import. Sign into Microsoft **inside Prism yourself**. This project needs no credentials.
|
||||
|
||||
Use native **Java 25 ARM64**, maximum heap **6144 MiB**, minimum **512 MiB** on your 16 GB M2 Pro. Prism can download Java automatically. Start at 1280×800 or 1920×1200; full Retina resolution is a larger GPU workload. [START-HERE.txt](packs/START-HERE.txt) has details. The same `.mrpack` files import into Prism on Windows and Linux.
|
||||
|
||||
If Prism is already installed, follow the [Mac import and first comparison guide](docs/mac-first-test.md).
|
||||
|
||||
Core and balanced also pass [macOS title/demo-world rendering probes](docs/client-graphics-smoke.md)
|
||||
on the hosted ARM64 software renderer, including readback, saves and clean exits.
|
||||
Physical M2 GPU performance and macOS 27 remain to be tested.
|
||||
|
||||
| Profile | Full-detail chunks | Distant LOD radius | Suggested maximum heap |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| baseline | 12 | none | 6144 MiB |
|
||||
| core-performance | 12 | none | 6144 MiB |
|
||||
| m2-balanced | 12 | 128 | 6144 MiB |
|
||||
| adaptive (experiment) | 12 | 128 | 6144 MiB |
|
||||
| worker-pacing (experiment) | 12 | 128 | 6144 MiB |
|
||||
| adaptive-pacing (experiment) | 12 | 128 | 6144 MiB |
|
||||
| queue-wait (experimental) | 12 | 128 | 6144 MiB |
|
||||
| adaptive-queue (experimental) | 12 | 128 | 6144 MiB |
|
||||
| dispatch-retry (experimental) | 12 | 128 | 6144 MiB |
|
||||
| tick-dedup (experimental) | 12 | 128 | 6144 MiB |
|
||||
| culling-empty (experimental) | 12 | 128 | 6144 MiB |
|
||||
| quad-reuse (experimental) | 12 | 128 | 6144 MiB |
|
||||
| terrain-position (experimental) | 12 | 128 | 6144 MiB |
|
||||
| culling-rays (experimental) | 12 | 128 | 6144 MiB |
|
||||
| foreground-first (combined experiment) | 12 | 128 | 6144 MiB |
|
||||
| foreground-vulkan (combined experiment) | 12 | 128 | 6144 MiB |
|
||||
| low-memory | 8 | none | 3072 MiB |
|
||||
| far-distance | 12 | 256 | 8192 MiB, with sufficient physical RAM |
|
||||
| cinematic | 12 | 128 | 6144 MiB |
|
||||
| vulkan | 12 | 128 | 6144 MiB |
|
||||
|
||||
Balanced combines [Sodium](https://modrinth.com/mod/sodium), [Lithium](https://modrinth.com/mod/lithium), [FerriteCore](https://modrinth.com/mod/ferrite-core), [ImmediatelyFast](https://modrinth.com/mod/immediatelyfast), [EntityCulling](https://modrinth.com/mod/entityculling), and [Distant Horizons](https://modrinth.com/mod/distanthorizons). Cinematic adds [Iris](https://modrinth.com/mod/iris) and [Complementary Reimagined](https://modrinth.com/shader/complementary-reimagined), initially disabled. Vulkan independently experiments with the game's own backend and fallback, without Iris.
|
||||
|
||||
Distant LOD is simplified terrain. Nearby blocks retain full detail. Initial generation costs CPU/disk/memory and needs warm-up. DH adjusts clouds, chunk fade and transparency to blend its renderer; assess appearance as well as speed. Shaders cost GPU time and have [Mac-specific limits](https://shaders.properties/current/reference/miscellaneous/macos/). Universal CPU/GPU support and exact vanilla equivalence remain validation goals. Simulation distance stays 12 in every profile; normal 20 TPS rules are retained.
|
||||
|
||||
For the first comparison at the same view distance, use `baseline` versus
|
||||
`core-performance`: both select 12 full-detail chunks and no distant LOD or shaders.
|
||||
The latter adds only the pinned core performance mods and leaves every original
|
||||
controller disabled. Then test balanced separately for its additional distant
|
||||
terrain. Matching captured settings does not prove pixel-identical rendering.
|
||||
[Core comparison protocol and selected observations](docs/core-performance.md)
|
||||
include three repeated matched-view software-rendered pairs with 14–21% higher
|
||||
FPS in this workload; M2 performance remains unmeasured.
|
||||
|
||||
[Heap budget experiment](docs/heap-budget.md): three pairs with 3 GiB versus
|
||||
1.5 GiB maximum heap show variable RAM savings and GC/frame-time tradeoffs;
|
||||
playable defaults remain unchanged.
|
||||
|
||||
[Matched graphics API comparison](docs/graphics-api-comparison.md): Vulkan adds
|
||||
about 1.5% average FPS but about 12% CPU in three Linux software-rendered pairs;
|
||||
backend defaults remain unchanged and physical Mac performance is unmeasured.
|
||||
|
||||
The optional `queue-wait` pack yields during pending distant-terrain debounce retries; `adaptive-queue` combines it with the existing controllers. [Queue experiment and measurement limits](docs/debounce-queue.md).
|
||||
|
||||
Version 0.16 adds a separate [terrain position arithmetic experiment](docs/terrain-position.md)
|
||||
for the sampled full-data lookup. It retains the pinned library’s unusual
|
||||
negative-coordinate rounding and invalid-level errors. Balanced keeps it off;
|
||||
whole-game and Mac performance still require measurement.
|
||||
|
||||
Version 0.15 adds an isolated [culling ray scratch experiment](docs/culling-rays.md)
|
||||
that reuses two numeric vectors within each culling instance while retaining
|
||||
upstream arithmetic and decisions. Balanced keeps it off; hardware gains remain
|
||||
unmeasured.
|
||||
|
||||
Version 0.14 adds an isolated [empty culling whitelist experiment](docs/culling-empty.md)
|
||||
that avoids allocating iterators while there are no dynamic handlers. Live
|
||||
registration and nonempty callbacks retain upstream behavior. Balanced keeps it
|
||||
off; whole-game gains still need hardware comparisons. DH profiles also request
|
||||
a scoped [interruptible blending-read wait](docs/terrain-read-wait.md) to let
|
||||
background workers leave a pending metadata read during shutdown.
|
||||
|
||||
Version 0.13 adds an isolated [tick membership experiment](docs/tick-membership.md)
|
||||
that reuses compact storage for DH's private per-tick membership checks. The
|
||||
combined foreground profiles include it too; balanced keeps it off. The applied
|
||||
holder test verifies action semantics and removes repeated entry allocations;
|
||||
whole-game FPS and RAM gains still need hardware measurements.
|
||||
|
||||
Version 0.12 captures effective distant-terrain quality, radius, worker budgets,
|
||||
Iris state and field of view. Start/end snapshots flag changed visual settings;
|
||||
[measurement details](docs/terrain-measurements.md) explain their limits.
|
||||
|
||||
Version 0.11 adds combined foreground-first OpenGL/Vulkan profiles with a 120 FPS
|
||||
adaptive goal, plus explicit collector experiments and GC measurement guidance.
|
||||
See [combined controls](docs/foreground-first.md), [Vulkan on your Mac](docs/vulkan.md)
|
||||
and [collector comparisons](docs/collectors.md). The frame goal is not a rendering cap.
|
||||
|
||||
Version 0.10 adds an isolated [rejected-dispatch retry experiment](docs/dispatch-retry.md).
|
||||
It bounds retry passes when a DH worker rejects queued work, preserving original
|
||||
requeue handling and allowing other executors to progress. Balanced keeps it off.
|
||||
|
||||
Version 0.9 also makes the queue's idle wait wakeable for incoming work, preserving
|
||||
its debounce rules and bounded cache-maintenance cadence. It remains part of the
|
||||
optional queue profiles, with separate wake-latency measurements.
|
||||
|
||||
Version 0.8 fixes a fresh-instance graphics preset that could override the selected
|
||||
render distance. It also records actual GC/header settings and supports an optional
|
||||
[compact object headers experiment](docs/compact-headers.md) for Java 25; packs
|
||||
do not enable that JVM flag automatically.
|
||||
|
||||
## Measure on your hardware
|
||||
|
||||
The optional [adaptive terrain experiment](docs/adaptive-terrain.md) throttles distant
|
||||
terrain background work when frames slow down or heap pressure rises, keeping the
|
||||
balanced profile's view distances and simulation settings. It remains opt-in until
|
||||
real hardware demonstrates a benefit.
|
||||
|
||||
The additional [precise worker pacing experiment](docs/worker-pacing.md) makes short
|
||||
terrain tasks respect their duty-cycle budget and avoids boxed worker timestamps.
|
||||
It changes generation speed and CPU use, so it stays separate from balanced.
|
||||
|
||||
Press **F8** during gameplay to start a 120-second recording, or again to stop early. Rebind in Controls if needed. This also works with restricted chat accounts. Alternatively: `/horizon bench <label> 120`, `/horizon stop`, `/horizon status`.
|
||||
|
||||
Use separate identical world copies and the same camera route, resolution, render/simulation distance, heap, VSync and FPS limit. Warm up, then alternate at least three baseline/optimized runs. Test fresh chunk exploration separately. For everyday play cap FPS or enable VSync to reduce power usage.
|
||||
|
||||
The instance's `horizon-benchmarks/` folder receives JSON/CSV frame and integrated-server tick timings: average FPS, slowest-1%-average FPS, p95/p99 durations, stalls, JVM heap/GC, sampled process RSS when available, GPU/backend/driver and render settings. Frames include presentation/limiting waits and exclude menus/pauses/unfocused time. Tick `meanRate` is execution capacity, **not TPS**; observed tick counts are separate. Version 0.20 [captures sampled tick-manager state](docs/tick-state.md), including restored freeze/step/sprint/rate changes; this does not measure completed world work. Resident process memory is sampled on a shared background thread only during recordings; it includes native resident pages, while heap measures JVM objects. Neither is a complete measurement of unified GPU memory. [Memory measurement details](docs/process-memory.md).
|
||||
|
||||
```sh
|
||||
python3 tools/compare_benchmarks.py baseline-frames.json optimized-frames.json --strict
|
||||
```
|
||||
|
||||
Open `Compare-Benchmarks.html` from the starter ZIP or [the source file](tools/Compare-Benchmarks.html) in your browser to compare without Python. Select each JSON and optionally its matching CSV. It exports summary JSON, flags settings and duration differences, and charts frames by recorded active time or ticks by sample number. It is self-contained and makes no network requests.
|
||||
|
||||
Version 0.18 adds an isolated [terrain quad reuse experiment](docs/quad-reuse.md).
|
||||
It reuses a temporary quad discarded by successful premerge when the existing
|
||||
pool would otherwise allocate. Generated geometry and thread ownership checks
|
||||
pass; allocation results are not whole-game RAM or FPS evidence. It remains off
|
||||
in combined profiles.
|
||||
|
||||
Version 0.17 also records loaded mod versions and the Java vendor, VM and runtime
|
||||
build in client and server reports. Both comparison tools flag software changes
|
||||
as explicit experiment variables; older reports remain usable with an unknown
|
||||
software warning. The viewer can expand the complete loaded mod list.
|
||||
[Live software identity check](benchmarks/software-identity-2026-10-04/live-observations.json)
|
||||
records the metadata and file-count validation; its short capture is not a
|
||||
performance comparison.
|
||||
|
||||
|
||||
The comparison flags captured setting differences, but cannot verify route, world, shader state or cache warm-up. See [validation evidence](docs/playable-validation.md). Software-renderer test FPS is not evidence of a Mac/GPU speedup.
|
||||
|
||||
For CPU/allocation investigation, [capture and stream a private JFR summary](docs/profiling.md).
|
||||
It distinguishes directly observed allocation counters from sampled hot methods;
|
||||
profiling runs remain separate from normal timing comparisons.
|
||||
|
||||
## Build and run
|
||||
|
||||
Requires Python 3.10+ and JDK 25. No Gradle, Rust or native compilation is required for playable packs.
|
||||
|
||||
```sh
|
||||
python3 tools/build_mod.py
|
||||
python3 tools/build_release.py
|
||||
```
|
||||
|
||||
Gitignored `dist/` contains twenty packs, our original instrumentation JAR, client/server starter ZIPs and SHA256SUMS. [mods.lock.json](packs/mods.lock.json) pins mod versions, exact dependency closure, SHA-1/SHA-512 and source/license; [fabric.lock.json](packs/fabric.lock.json) pins loader/library SHA-256. Packs use the [Modrinth format](https://support.modrinth.com/en/articles/8802351-modrinth-modpack-format-mrpack). They embed only original project code; third-party mods, game and assets download from their publishers.
|
||||
|
||||
The server starter uses Lithium/FerriteCore and `/horizonserver bench <label> <seconds>`. [Server instructions](docs/server-quickstart.txt) cover setup and a baseline. Files are prepared before you accept Minecraft's EULA locally. A 50-active-player workload remains to be measured.
|
||||
|
||||
Local smoke testing uses the game's built-in limited demo; normal play uses Prism's licensed account authentication:
|
||||
|
||||
```sh
|
||||
python3 tools/build_pack.py --profile m2-balanced --instance .local/runtime/m2-balanced
|
||||
vscreen run python3 tools/runtime.py demo --instance .local/runtime/m2-balanced
|
||||
```
|
||||
|
||||
The standalone demo launcher applies the pinned official manifest's conditional
|
||||
JVM flags, including macOS `-XstartOnFirstThread` and the Windows heap-dump-path
|
||||
option. Prism applies its own official manifest. Server JVM policy is separate;
|
||||
this launcher correction is not a measured graphics performance improvement.
|
||||
|
||||
## Local game inspection
|
||||
|
||||
Game JARs, decompiled Java, libraries, inventories, worlds and logs live **inside this checkout** under gitignored **`.local/`**. No game code is in Git history or release downloads. Fresh clones regenerate the inspection workspace from official downloads; Microsoft credentials are not needed for this step.
|
||||
|
||||
```sh
|
||||
git clone https://github.com/ludovic111/horizon.git
|
||||
cd horizon
|
||||
git config core.hooksPath .githooks
|
||||
python3 tools/lab.py prepare
|
||||
python3 tools/lab.py decompile
|
||||
python3 tools/lab.py status
|
||||
```
|
||||
|
||||
`research-lock.json` pins the official manifest and Vineflower. The inner server JAR is extracted and checked; client/server libraries provide decompiler context. Output: `.local/minecraft/26.3/sources/{client,server}/` and coverage/inventory reports. Current inventories cover 11,383 client classes and 7,762 server classes, producing 7,301/5,037 Java files. See [decompilation status](docs/decompilation-status.md).
|
||||
|
||||
Class-file SourceFile metadata covers inner classes, which often share a source file. Coverage does not prove semantic equivalence or recompilability; original bytecode remains the reference. Completed source directories are not overwritten automatically. Older obfuscated releases require a separate remapping stage.
|
||||
|
||||
## Original Rust research
|
||||
|
||||
The dependency-free `horizon-core` crate starts the Rust simulation foundation:
|
||||
integer block/chunk/section positions, legacy and xoroshiro seeded random streams and positional factories,
|
||||
padded palette-index storage, scheduled block/fluid tick queues, and double-precision
|
||||
bounding-box and voxel-grid collision geometry. Noise samplers, octave stacks and
|
||||
bulk density kernels provide the next world-generation foundation. Compiled
|
||||
density samplers add gradients, shifted and blended terrain noise, distance
|
||||
metrics and arithmetic evaluation.
|
||||
Differential runners compare selected
|
||||
operations with the checksum-pinned vanilla client and server bytecode.
|
||||
[Implemented scope, validation, and remaining rewrite work](docs/rust-parity.md).
|
||||
|
||||
```sh
|
||||
python3 tools/test_rust_parity.py --prepare
|
||||
python3 tools/test_world_parity.py
|
||||
python3 tools/test_tick_parity.py
|
||||
python3 tools/test_geometry_parity.py
|
||||
python3 tools/test_collision_parity.py
|
||||
python3 tools/test_noise_parity.py
|
||||
python3 tools/test_density_parity.py
|
||||
```
|
||||
|
||||
The core corpus checks 1,634,520 output lines per reference JAR, including
|
||||
signed boundaries, RNG rejection/state consumption and raw storage words.
|
||||
Passing it does not establish full gameplay parity or an FPS improvement.
|
||||
The separate [noise suite](docs/noise-generation.md) checks 26.3 Perlin/simplex,
|
||||
derivatives, density-volume accumulation, stack composition, normal-noise
|
||||
normalization and modern/legacy initialization against both reference JARs.
|
||||
The [density suite](docs/density-functions.md) checks compiled scalar and bulk
|
||||
evaluation, including nested samplers, their different arithmetic paths, and
|
||||
selected interval operations used for graph range analysis.
|
||||
|
||||
`horizon-world` adds NBT, four region compression codecs, `.mca`/`.mcc`
|
||||
reading and export, saved palettes, a version-checked block-state registry,
|
||||
and packed resident block sections. The world-data suite checks Rust output
|
||||
with the actual vanilla NBT, region and block-state decoders on both JARs.
|
||||
It covers all 35,723 exported state IDs and a 100,000-edit section trace.
|
||||
[World-data commands and validation limits](docs/world-data.md).
|
||||
|
||||
Scheduled ticks now support vanilla ordering, duplicate suppression, save/reload,
|
||||
chunk eligibility and callback mutations. The tick suite compares 97,776 output
|
||||
lines per reference JAR and checks saved block/fluid lists through vanilla codecs
|
||||
and region files. [Scheduler behavior and remaining integration](docs/scheduled-ticks.md).
|
||||
|
||||
Voxel shapes preserve vanilla collision tolerances, greedy box ordering, ray faces,
|
||||
inside hits, and cube-versus-array cell lookup. A cached collision registry connects
|
||||
imported shapes to resident block sections while checking exact state identities.
|
||||
Movement helpers resolve supplied colliders and step-up candidates, including
|
||||
landing adjustment and the second collider query. Movement-path block visits
|
||||
preserve vanilla ordering, step indices and packed-position deduplication.
|
||||
Uncached states require block behavior; the entity-context overload also needs
|
||||
separate implementation. [Geometry and collision scope](docs/collision-geometry.md).
|
||||
|
||||
```sh
|
||||
cargo test --workspace
|
||||
cargo run --release --bin voxel-bench -- 100 > .local/voxel-benchmark.csv
|
||||
```
|
||||
|
||||
The dependency-free occupancy experiment compares scalar and bitset exposed-face counting for synthetic 16³ sections. It has no real mesh, material/AO/light work, neighboring-section context, JNI bridge or game integration. Speedups are kernel-only, not Minecraft FPS. [Research plan](docs/optimization-plan.md) describes profiling, improved Java baselines, native integration and behavior checks before expanding scope.
|
||||
|
||||
Public branding and new mod downloads use **Horizon**. The existing Fabric mod
|
||||
ID and `dev.horizonlab` namespace remain stable for installed instances and
|
||||
measurement compatibility. The installer backs up both old `horizon-lab-*.jar`
|
||||
and new `horizon-*.jar` versions before installing an update.
|
||||
|
||||
## Validation and ownership
|
||||
|
||||
```sh
|
||||
python3 -m unittest discover -s tests -v
|
||||
python3 tools/build_mod.py --test-only
|
||||
cargo fmt --all -- --check
|
||||
cargo clippy --workspace --all-targets -- -D warnings
|
||||
cargo test --workspace
|
||||
python3 tools/check_public_tree.py
|
||||
python3 tools/check_public_tree.py --history
|
||||
```
|
||||
|
||||
CI checks offline tools/Rust and compiles the original mod/builds packs on Linux and Apple Silicon macOS. Game dependencies download to ephemeral `.local/`; CI uploads only our original JAR and packs. Compilation is not Mac GPU gameplay testing. Publication checks allow Java only under our original `dev/horizonlab` namespace; review diffs as well.
|
||||
CI runs these checks on GitHub's Linux runners. The vanilla comparisons need the game, which Horizon never downloads, so they run only when started by hand on a self-hosted runner holding the maintainer's own copy. Never commit game files, decompiled source or prepared resources: `tools/check_public_tree.py` rejects them, and tracked Java is allowed only under the project's own `dev/horizonlab` namespace.
|
||||
|
||||
[MIT](LICENSE) covers only our original tracked work. Dependencies retain their licenses. Mojang [removed obfuscation](https://www.minecraft.net/en-us/article/removing-obfuscation-in-java-edition) without changing [Minecraft's EULA](https://www.minecraft.net/en-us/eula). Decompiled game source remains local; published code implements independent tooling and instrumentation.
|
||||
## Licence
|
||||
|
||||
Integrated-server reports record the shared graphics backend at recording start; see [the context and comparison limits](docs/server-graphics-context.md).
|
||||
[MIT](LICENSE), for the project's original work only. Dependencies keep their own licences. Minecraft is a trademark of Mojang Synergies AB; Minecraft code and assets belong to Mojang and Microsoft and are covered by the [Minecraft EULA](https://www.minecraft.net/en-us/eula). Decompiled game source and prepared resources stay on your machine and are never published.
|
||||
|
||||
## Author
|
||||
|
||||
Made by [Ludovic Marie](https://lu4ovic.com) ([@ludovic111](https://github.com/ludovic111)).
|
||||
@@ -1,401 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Client scene startup, framebuffer readback and clean exit; not a performance benchmark",
|
||||
"release_binary": "0.20.0",
|
||||
"production_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"macos_required_ci": {
|
||||
"run": 37192178667,
|
||||
"source_commit": "a5000edf11094e00ebef0fc362aa4adc322f2df6",
|
||||
"all_jobs_passed": true,
|
||||
"reports": {
|
||||
"title": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "title",
|
||||
"title_screen_observed": true,
|
||||
"world_loaded": false,
|
||||
"ready_client_ticks": 53,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1525,
|
||||
"gpu": "Apple Software Renderer",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.1 APPLE-23.1.1",
|
||||
"private_png_sha256": "ed503082baca3a8646e7e864bf363e6e2a705a2b4aade2ec4bae6d3a108b07ab",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"observed_mode": "title",
|
||||
"title_screen_observed": true,
|
||||
"world_loaded": false,
|
||||
"ready_client_ticks": 55,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1855,
|
||||
"gpu": "Apple Software Renderer",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.1 APPLE-23.1.1",
|
||||
"private_png_sha256": "959fe6afbe1897cd9711c083e88ccc617ee9d8669983987abda84e0f5979e82d",
|
||||
"profile": "m2-balanced",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
},
|
||||
"world": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 40,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1537,
|
||||
"gpu": "Apple Software Renderer",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.1 APPLE-23.1.1",
|
||||
"private_png_sha256": "31be5cc8188b3494d76232cba79cf320a64523b4906ab720a38997a125eb37fa",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 40,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 2074,
|
||||
"gpu": "Apple Software Renderer",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.1 APPLE-23.1.1",
|
||||
"private_png_sha256": "0929c865d723fe0eea8f37bcc45e9636c6f342d04fe507f9bd592dfd30d73f42",
|
||||
"profile": "m2-balanced",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"earlier_vulkan_research": {
|
||||
"run": 37191171799,
|
||||
"source_commit": "3858ab38b51f434ebe892b564e013c7c8bcaba45",
|
||||
"outcomes": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan",
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"expected_demo_authentication_errors_observed": true
|
||||
},
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan",
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"expected_demo_authentication_errors_observed": true
|
||||
},
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan",
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"expected_demo_authentication_errors_observed": true
|
||||
}
|
||||
],
|
||||
"full_private_logs_uploaded": false,
|
||||
"readback_request_stage_not_yet_captured": true
|
||||
},
|
||||
"selected_local_software_checks": {
|
||||
"linux-opengl": {
|
||||
"title_screen_observed": true,
|
||||
"title_client_ticks": 56,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1762,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.5 (Core Profile) Mesa 26.0.8-1ubuntu0.3",
|
||||
"private_png_sha256": "cf4eaa7d576ec8f608205258774fbd2384bf5382da86b60628d590f959145fd3",
|
||||
"profile": "core-performance",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
},
|
||||
"linux-vulkan": {
|
||||
"title_screen_observed": true,
|
||||
"title_client_ticks": 56,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1743,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.4.335 llvmpipe Mesa 26.0.8-1ubuntu0.3 (LLVM 21.1.8)",
|
||||
"private_png_sha256": "edfc9b8431505c9c009da7bb8be0ed5676effb90757cd4ae4bda525e4db5da8c",
|
||||
"profile": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
},
|
||||
"linux-world-core": {
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 51,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1297,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.5 (Core Profile) Mesa 26.0.8-1ubuntu0.3",
|
||||
"private_png_sha256": "1a8ba681681f5e37986e1b411e5ebc80d47279c54368f43f935707092b70ffd0",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
},
|
||||
"linux-world-balanced": {
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 40,
|
||||
"window_active": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1551,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.5 (Core Profile) Mesa 26.0.8-1ubuntu0.3",
|
||||
"private_png_sha256": "82ced9bcf7178a35063e6a7fa9049fe7cfcf26dcb92aace59de6bb022609833a",
|
||||
"profile": "m2-balanced",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"limits": [
|
||||
"macOS OpenGL uses Apple Software Renderer; Vulkan exposes Apple Paravirtual device. No physical M2 GPU performance test.",
|
||||
"World-mode checks ordinary limited-demo world startup and saved data, not exhaustive gameplay or completed LOD generation.",
|
||||
"A nonuniform framebuffer does not prove pixel-correct rendering.",
|
||||
"Three exploratory Vulkan cases fail with VK_ERROR_FEATURE_NOT_PRESENT after successful device creation; later stage remains to be isolated.",
|
||||
"The probe uses 3 GiB; balanced can warn about low memory. The 16 GB Mac starter suggests 6 GiB.",
|
||||
"No FPS, CPU/RAM reduction, statistical speedup or universal hardware-compatibility claim.",
|
||||
"Raw PNGs, assets, world files and full logs remain private. Production JAR matches the published binary and excludes probe classes."
|
||||
]
|
||||
}
|
||||
@@ -1,303 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Single fixed-order stationary matched-view Linux software-rendered pair; descriptive observations, not statistical hardware speedup",
|
||||
"minecraft": "26.3",
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"graphics": "llvmpipe LLVM21.1.8 OpenGL,1280x800",
|
||||
"captured_settings_match": true,
|
||||
"settings": {
|
||||
"full_detail_chunks": 12,
|
||||
"simulation_chunks": 12,
|
||||
"distant_terrain": "not installed",
|
||||
"iris_shaders": "not installed",
|
||||
"heap_max": "3G",
|
||||
"collector": "G1",
|
||||
"compact_headers": true,
|
||||
"world_difficulty": "PEACEFUL",
|
||||
"fov": 70,
|
||||
"graphics_preset": "CUSTOM",
|
||||
"frame_limit": "uncapped",
|
||||
"all_original_controllers": false
|
||||
},
|
||||
"runs": [
|
||||
{
|
||||
"profile": "baseline",
|
||||
"elapsed_seconds": 120.175428046,
|
||||
"frame_samples": 651,
|
||||
"tick_samples": 2401,
|
||||
"tick_elapsed_seconds": 120.028670836,
|
||||
"recorded_tick_samples_per_elapsed_second": 20.003554011529317,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 651,
|
||||
"meanMs": 183.95013769585256,
|
||||
"p50Ms": 181.43732,
|
||||
"p95Ms": 194.888166,
|
||||
"p99Ms": 242.713818,
|
||||
"maxMs": 300.17755,
|
||||
"meanRate": 5.436255783909352,
|
||||
"lowOnePercentRate": 3.864724477942431,
|
||||
"over16Ms": 651,
|
||||
"over33Ms": 651,
|
||||
"over50Ms": 651,
|
||||
"over100Ms": 651
|
||||
},
|
||||
"tick_execution_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 8.97966414119117,
|
||||
"p50Ms": 7.166902,
|
||||
"p95Ms": 16.131444,
|
||||
"p99Ms": 19.670957,
|
||||
"maxMs": 38.194457,
|
||||
"meanRate": 111.36273966114595,
|
||||
"lowOnePercentRate": 43.536701509030834,
|
||||
"over16Ms": 106,
|
||||
"over33Ms": 2,
|
||||
"over50Ms": 0,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_cpu_seconds": 337.86,
|
||||
"process_rss_peak_sampled_bytes": 2842439680,
|
||||
"mods": [
|
||||
"[email protected]+38c7a2d55d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+26.3",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+0ae6f9115d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+6b5b47fd5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+427eab975d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+47f74c985d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+cf6bc2db5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+ffef5f675d",
|
||||
"[email protected]+4068fd645d",
|
||||
"[email protected]+ed66f0a35d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+79385d0b5d",
|
||||
"[email protected]+b9d63e335d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+901a437c5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+4fc5413f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+48607d035d",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+52268a0e5d",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"java@25",
|
||||
"[email protected]",
|
||||
"[email protected]"
|
||||
],
|
||||
"preceding_jfr_server_render_allocation_counters": [
|
||||
{
|
||||
"thread_id": 59,
|
||||
"thread": "Server thread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.375293599,
|
||||
"observed_allocated_bytes": 1096511648,
|
||||
"observed_bytes_per_second": 17033112.96458356
|
||||
},
|
||||
{
|
||||
"thread_id": 3,
|
||||
"thread": "Render thread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.375293599,
|
||||
"observed_allocated_bytes": 203851256,
|
||||
"observed_bytes_per_second": 3166607.0102889067
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 30.391511,
|
||||
"preceding_jfr_gc_pause_longest_ms": 18.705464,
|
||||
"exit_code": 0
|
||||
},
|
||||
{
|
||||
"profile": "core-performance",
|
||||
"elapsed_seconds": 120.10416213,
|
||||
"frame_samples": 785,
|
||||
"tick_samples": 2402,
|
||||
"tick_elapsed_seconds": 120.041892203,
|
||||
"recorded_tick_samples_per_elapsed_second": 20.0096812530915,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 785,
|
||||
"meanMs": 152.43891740636943,
|
||||
"p50Ms": 150.474848,
|
||||
"p95Ms": 163.179892,
|
||||
"p99Ms": 198.41,
|
||||
"maxMs": 228.508471,
|
||||
"meanRate": 6.560004603904492,
|
||||
"lowOnePercentRate": 4.756900949481116,
|
||||
"over16Ms": 785,
|
||||
"over33Ms": 785,
|
||||
"over50Ms": 785,
|
||||
"over100Ms": 785
|
||||
},
|
||||
"tick_execution_stats": {
|
||||
"count": 2402,
|
||||
"meanMs": 6.370044777268943,
|
||||
"p50Ms": 5.805562,
|
||||
"p95Ms": 10.732708,
|
||||
"p99Ms": 13.377683,
|
||||
"maxMs": 23.875155,
|
||||
"meanRate": 156.98476776308226,
|
||||
"lowOnePercentRate": 63.74793922036882,
|
||||
"over16Ms": 5,
|
||||
"over33Ms": 0,
|
||||
"over50Ms": 0,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_cpu_seconds": 345.46,
|
||||
"process_rss_peak_sampled_bytes": 2211401728,
|
||||
"mods": [
|
||||
"[email protected]",
|
||||
"[email protected]+38c7a2d55d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+26.3",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+0ae6f9115d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+6b5b47fd5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+427eab975d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+47f74c985d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+cf6bc2db5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+ffef5f675d",
|
||||
"[email protected]+4068fd645d",
|
||||
"[email protected]+ed66f0a35d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+79385d0b5d",
|
||||
"[email protected]+b9d63e335d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+901a437c5d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+4fc5413f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+48607d035d",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+3434d6d95d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+52268a0e5d",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+26.3",
|
||||
"java@25",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]"
|
||||
],
|
||||
"preceding_jfr_server_render_allocation_counters": [
|
||||
{
|
||||
"thread_id": 55,
|
||||
"thread": "Server thread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.387372441,
|
||||
"observed_allocated_bytes": 691148360,
|
||||
"observed_bytes_per_second": 10734222.158752
|
||||
},
|
||||
{
|
||||
"thread_id": 3,
|
||||
"thread": "Render thread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.387372441,
|
||||
"observed_allocated_bytes": 107888768,
|
||||
"observed_bytes_per_second": 1675619.9843200867
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 54.65954,
|
||||
"preceding_jfr_gc_pause_longest_ms": 25.746574,
|
||||
"exit_code": 0
|
||||
}
|
||||
],
|
||||
"provenance": {
|
||||
"production_mod_source_commit": "2a268fefbf0ab3d478ca7755e609f7146d6f5145",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37179596850",
|
||||
"runtime_mod_matches_linux_ci": true,
|
||||
"original_mod_sha256": "df0bab0a6d87a1c609a051c190939010506f8cdd81897e82aa48caad032ef4e0",
|
||||
"initial_player_snapshot_sha256": "b4d11dbd6443625415a1e32aa242d0e2d09cd77ddb1becfde5d35cb6ab8d278a",
|
||||
"saved_first_cameras_match": true,
|
||||
"saved_camera": {
|
||||
"position": [
|
||||
-56.5,
|
||||
69.0,
|
||||
55.5
|
||||
],
|
||||
"rotation": [
|
||||
141.5,
|
||||
16.950002670288086
|
||||
]
|
||||
},
|
||||
"private_world_timing_protocol": {
|
||||
"world_copy": "private only",
|
||||
"advance_time": false,
|
||||
"advance_weather": false,
|
||||
"overworld_clock_ticks": 6000,
|
||||
"modified_file_sha256": {
|
||||
"game_rules": "47abf5e1fe82d54057ad7b095df3b9e29a8e4e9db7484988e09f3caaeedc12eb",
|
||||
"world_clocks": "575d4a7663b154077a5be4c596790f3af178a00ab5a1e9cd58f37c1afa2c03b5"
|
||||
},
|
||||
"level_and_player_files_unchanged": true,
|
||||
"pack_default_rules_unchanged": true
|
||||
},
|
||||
"clock_and_rules_verified_after_both_saves": true,
|
||||
"candidate_save_reload_second_save_exit_zero": true
|
||||
},
|
||||
"notes": [
|
||||
"Separate private copies, baseline then core. JFR begins about 121 seconds after demo dismissal; a separate 120-second frame capture begins about 307 seconds after dismissal.",
|
||||
"Both captures have zero menu/pause/focus exclusions and no drops. Actual CSV counts and means match; viewer charts, 390-pixel layout and explicit software-change warnings pass.",
|
||||
"Core records about 20.7% higher average FPS and 22.2% lower sampled peak RSS in this pair; whole-process CPU is slightly higher while rendering more frames.",
|
||||
"No mod is isolated by this group comparison. Rendering-work completion, entity activity, cache/JIT and thermal state remain variables. Matching captured configuration is not pixel equivalence or exhaustive vanilla gameplay proof.",
|
||||
"Tick execution inverse meanRate is capacity, not actual TPS. Record counts/elapsed seconds are exposed separately and include any pauses. Both captures have about 20 tick samples per elapsed second.",
|
||||
"Preceding JFR server/render allocation counters are lower with core, but total and longest measured GC pauses are higher. Those profiles precede the frame captures and are not simultaneous with them.",
|
||||
"No hardware GPU or M2/Apple Silicon result; RSS is not complete unified/GPU memory. Repeat alternating trials on real hardware.",
|
||||
"No private worlds, full game logs, JFR recordings, game binaries or fixture agents are included."
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"entity_culling": "1.11.2",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"empty_iterator_calls": 1,
|
||||
"live_registration_checked": true,
|
||||
"block_callback_order_checked": true,
|
||||
"type_guard_checked": true,
|
||||
"allocated_bytes": 128001272,
|
||||
"cpu_ns": 29632156,
|
||||
"wall_ns": 49712014,
|
||||
"measured_calls": 4000000,
|
||||
"result": false
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"empty_iterator_calls": 0,
|
||||
"live_registration_checked": true,
|
||||
"block_callback_order_checked": true,
|
||||
"type_guard_checked": true,
|
||||
"allocated_bytes": 208,
|
||||
"cpu_ns": 809881,
|
||||
"wall_ns": 801517,
|
||||
"measured_calls": 4000000,
|
||||
"result": false
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual publisher whitelist methods inside Fabric; live registration and block-entity callbacks checked.",
|
||||
"Nonempty iteration, callback order, short circuit, null/wrong-type inputs and clearing retain upstream behavior.",
|
||||
"Empty-state iterator counts use a private instrumented set; allocation loop uses normal empty HashSets.",
|
||||
"Entity callbacks with a valid game entity are not exercised by this menu-only fixture.",
|
||||
"JIT escape analysis can remove allocations in an isolated loop; real culling-thread profiles are needed.",
|
||||
"Not a game FPS, whole-game RAM, visual equivalence or Mac GPU benchmark.",
|
||||
"Much of an empty warmed loop may be folded by the JIT; CPU timings are not per-check costs or game speed estimates."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "35dd69e9a6279fa89d762a0d24e49b0dbdb11b51",
|
||||
"ci_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37164002916",
|
||||
"artifact": "horizon-ubuntu-latest"
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"entity_culling": "1.11.2",
|
||||
"original_mod_sha256": "7351b417fc83460def5947636444413874ee812e949342f091ef03674e0c0e58",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"public_boxes": 12800,
|
||||
"provider_reads": 105239,
|
||||
"edge_rays": 2197,
|
||||
"visibility_digest": "da7286327283ce854dca2ab798d97c3b1cde55ac67112bd231c48df6d9388e00",
|
||||
"query_digest": "124074ad764ab680b93896d47fa347a15f0b17ef41d2f8af5bd8e75f75208e12",
|
||||
"intersection_digest": "f311c0b608b44b9eab2bb1e6347c3e18b003d05c939a8fbea9ba81fb16c8e8ae",
|
||||
"allocated_bytes": 1040,
|
||||
"cpu_ns": 101807697,
|
||||
"wall_ns": 162651689,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 0,
|
||||
"input_unchanged": true,
|
||||
"scratch_ownership_checked": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"public_boxes": 12800,
|
||||
"provider_reads": 105239,
|
||||
"edge_rays": 2197,
|
||||
"visibility_digest": "da7286327283ce854dca2ab798d97c3b1cde55ac67112bd231c48df6d9388e00",
|
||||
"query_digest": "124074ad764ab680b93896d47fa347a15f0b17ef41d2f8af5bd8e75f75208e12",
|
||||
"intersection_digest": "f311c0b608b44b9eab2bb1e6347c3e18b003d05c939a8fbea9ba81fb16c8e8ae",
|
||||
"allocated_bytes": 920,
|
||||
"cpu_ns": 118540489,
|
||||
"wall_ns": 235470173,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 0,
|
||||
"input_unchanged": true,
|
||||
"scratch_ownership_checked": true
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual upstream culling methods inside Fabric; private fixture invokers do not enter production packs.",
|
||||
"Two interleaved instances and several occluder patterns; matching boolean and query digests.",
|
||||
"Signed zero, tiny/large values, infinities and NaN are exercised directly in ray intersection.",
|
||||
"Unchanged input vectors, independent instance scratch and upstream arithmetic values are checked.",
|
||||
"Allocation and CPU are single warmed caller-loop observations; JIT folding can vary.",
|
||||
"Not a game FPS, visual-equivalence proof, whole-game RAM or Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "7cbe37b60594fb1631bc308f126d7925c4264a18",
|
||||
"command": "python tools/test_culling_rays.py",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37168352974",
|
||||
"job": "portable-mod (ubuntu-latest)",
|
||||
"artifact": "horizon-ubuntu-latest"
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"entity_culling": "1.11.2",
|
||||
"original_mod_sha256": "7351b417fc83460def5947636444413874ee812e949342f091ef03674e0c0e58",
|
||||
"platform": "Linux x86_64",
|
||||
"graphics": "llvmpipe software OpenGL",
|
||||
"settings": {
|
||||
"heap_bytes": 3221225472,
|
||||
"gc": "G1",
|
||||
"compact_headers": true,
|
||||
"render_distance": 12,
|
||||
"simulation_distance": 12,
|
||||
"lod_radius_chunks": 128,
|
||||
"lod_quality": "MEDIUM/MEDIUM/BLOCK",
|
||||
"terrain_workers": 2,
|
||||
"runtime_ratio": 0.5,
|
||||
"world_difficulty": "PEACEFUL",
|
||||
"empty_culling_whitelist": false
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"profile": "m2-balanced",
|
||||
"ray_enabled": false,
|
||||
"elapsed_seconds": 120.02619604,
|
||||
"frame_samples": 599,
|
||||
"tick_samples": 2400,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"culling_allocation_counter": {
|
||||
"thread_id": 49,
|
||||
"thread": "CullThread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.509265987,
|
||||
"observed_allocated_bytes": 1817768,
|
||||
"observed_bytes_per_second": 28178.40153949851
|
||||
}
|
||||
},
|
||||
{
|
||||
"profile": "culling-rays",
|
||||
"ray_enabled": true,
|
||||
"elapsed_seconds": 120.099980458,
|
||||
"frame_samples": 584,
|
||||
"tick_samples": 2401,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"culling_allocation_counter": {
|
||||
"thread_id": 49,
|
||||
"thread": "CullThread",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.321034235,
|
||||
"observed_allocated_bytes": 1798336,
|
||||
"observed_bytes_per_second": 27958.754416629756
|
||||
}
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Fixed-order single pair using separate copies of the same private saved world and stationary view, with approximately three-minute warm-up before clean frame recordings.",
|
||||
"One earlier candidate frame capture contained pause exclusions and was discarded; its separate preceding allocation recording had already completed.",
|
||||
"Allocation counters have their own roughly 64-second observation spans; recordings started approximately 36-42 seconds after joining. Profiling overhead and JIT/cache effects are not eliminated.",
|
||||
"Both worlds saved and exited with no crash report or remaining game process. The outer foreground control launcher returned 143; it did not expose the game exit status.",
|
||||
"No useful allocation reduction or whole-game speedup is established. Not a Mac, retained-memory or GPU performance benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "349724b3b612351daa1616daa79beca8897839ab",
|
||||
"runtime_mod_matches_linux_ci": true,
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37168818519"
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"entity_culling": "1.11.2",
|
||||
"original_mod_sha256": "7351b417fc83460def5947636444413874ee812e949342f091ef03674e0c0e58",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"public_boxes": 12800,
|
||||
"provider_reads": 105239,
|
||||
"edge_rays": 2197,
|
||||
"visibility_digest": "da7286327283ce854dca2ab798d97c3b1cde55ac67112bd231c48df6d9388e00",
|
||||
"query_digest": "124074ad764ab680b93896d47fa347a15f0b17ef41d2f8af5bd8e75f75208e12",
|
||||
"intersection_digest": "f311c0b608b44b9eab2bb1e6347c3e18b003d05c939a8fbea9ba81fb16c8e8ae",
|
||||
"allocated_bytes": 24318096,
|
||||
"cpu_ns": 166989515,
|
||||
"wall_ns": 239648128,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 0,
|
||||
"input_unchanged": true,
|
||||
"scratch_ownership_checked": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"public_boxes": 12800,
|
||||
"provider_reads": 105239,
|
||||
"edge_rays": 2197,
|
||||
"visibility_digest": "da7286327283ce854dca2ab798d97c3b1cde55ac67112bd231c48df6d9388e00",
|
||||
"query_digest": "124074ad764ab680b93896d47fa347a15f0b17ef41d2f8af5bd8e75f75208e12",
|
||||
"intersection_digest": "f311c0b608b44b9eab2bb1e6347c3e18b003d05c939a8fbea9ba81fb16c8e8ae",
|
||||
"allocated_bytes": 920,
|
||||
"cpu_ns": 149367051,
|
||||
"wall_ns": 165549458,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 0,
|
||||
"input_unchanged": true,
|
||||
"scratch_ownership_checked": true
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual upstream culling methods inside Fabric; private fixture invokers do not enter production packs.",
|
||||
"Two interleaved instances and several occluder patterns; matching boolean and query digests.",
|
||||
"Signed zero, tiny/large values, infinities and NaN are exercised directly in ray intersection.",
|
||||
"Unchanged input vectors, independent instance scratch and upstream arithmetic values are checked.",
|
||||
"Allocation and CPU are single warmed caller-loop observations; JIT folding can vary.",
|
||||
"Not a game FPS, visual-equivalence proof, whole-game RAM or Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "7cbe37b60594fb1631bc308f126d7925c4264a18",
|
||||
"command": "python tools/test_culling_rays.py"
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Darwin 25.6.0 arm64; logical CPUs 3
|
||||
mode=upstream size=1 polls=2050320 worker_cpu_ms=218.517 wall_ms=250.000 worker_allocated_bytes=65610240
|
||||
mode=wait size=1 polls=24 worker_cpu_ms=1.116 wall_ms=250.103 worker_allocated_bytes=768
|
||||
mode=upstream size=1 polls=2641880 worker_cpu_ms=247.157 wall_ms=250.000 worker_allocated_bytes=84540160
|
||||
mode=wait size=1 polls=26 worker_cpu_ms=0.873 wall_ms=258.012 worker_allocated_bytes=832
|
||||
mode=upstream size=1 polls=2502067 worker_cpu_ms=248.481 wall_ms=250.000 worker_allocated_bytes=80066144
|
||||
mode=wait size=1 polls=22 worker_cpu_ms=0.693 wall_ms=252.426 worker_allocated_bytes=704
|
||||
mode=upstream size=64 polls=1073260 worker_cpu_ms=249.930 wall_ms=250.000 worker_allocated_bytes=34344320
|
||||
mode=wait size=64 polls=21 worker_cpu_ms=0.624 wall_ms=251.431 worker_allocated_bytes=672
|
||||
mode=upstream size=64 polls=1117775 worker_cpu_ms=248.519 wall_ms=250.000 worker_allocated_bytes=35768800
|
||||
mode=wait size=64 polls=66 worker_cpu_ms=1.172 wall_ms=252.401 worker_allocated_bytes=2112
|
||||
mode=upstream size=64 polls=1017233 worker_cpu_ms=248.550 wall_ms=250.000 worker_allocated_bytes=32551456
|
||||
mode=wait size=64 polls=74 worker_cpu_ms=1.154 wall_ms=250.207 worker_allocated_bytes=2368
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Linux 6.17.0-1022-azure x86_64; logical CPUs 4
|
||||
mode=upstream size=1 polls=3147912 worker_cpu_ms=248.446 wall_ms=250.000 worker_allocated_bytes=100733184
|
||||
mode=wait size=1 polls=234 worker_cpu_ms=3.085 wall_ms=250.068 worker_allocated_bytes=7488
|
||||
mode=upstream size=1 polls=3108002 worker_cpu_ms=249.985 wall_ms=250.000 worker_allocated_bytes=99456064
|
||||
mode=wait size=1 polls=235 worker_cpu_ms=2.960 wall_ms=250.088 worker_allocated_bytes=7520
|
||||
mode=upstream size=1 polls=3073051 worker_cpu_ms=248.404 wall_ms=250.000 worker_allocated_bytes=98337632
|
||||
mode=wait size=1 polls=235 worker_cpu_ms=2.904 wall_ms=250.067 worker_allocated_bytes=7520
|
||||
mode=upstream size=64 polls=999765 worker_cpu_ms=248.680 wall_ms=250.000 worker_allocated_bytes=31992480
|
||||
mode=wait size=64 polls=235 worker_cpu_ms=2.887 wall_ms=250.067 worker_allocated_bytes=7520
|
||||
mode=upstream size=64 polls=999096 worker_cpu_ms=250.000 wall_ms=250.000 worker_allocated_bytes=31971072
|
||||
mode=wait size=64 polls=234 worker_cpu_ms=2.890 wall_ms=250.068 worker_allocated_bytes=7488
|
||||
mode=upstream size=64 polls=992373 worker_cpu_ms=249.987 wall_ms=250.000 worker_allocated_bytes=31755936
|
||||
mode=wait size=64 polls=234 worker_cpu_ms=2.891 wall_ms=250.068 worker_allocated_bytes=7488
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Windows 2025Server AMD64; logical CPUs 4
|
||||
mode=upstream size=1 polls=3016566 worker_cpu_ms=234.375 wall_ms=250.000 worker_allocated_bytes=96530112
|
||||
mode=wait size=1 polls=173 worker_cpu_ms=0.000 wall_ms=250.006 worker_allocated_bytes=5536
|
||||
mode=upstream size=1 polls=2991508 worker_cpu_ms=250.000 wall_ms=250.000 worker_allocated_bytes=95728256
|
||||
mode=wait size=1 polls=175 worker_cpu_ms=0.000 wall_ms=250.856 worker_allocated_bytes=5600
|
||||
mode=upstream size=1 polls=2979343 worker_cpu_ms=250.000 wall_ms=250.000 worker_allocated_bytes=95338976
|
||||
mode=wait size=1 polls=171 worker_cpu_ms=0.000 wall_ms=251.306 worker_allocated_bytes=5472
|
||||
mode=upstream size=64 polls=1001664 worker_cpu_ms=250.000 wall_ms=250.000 worker_allocated_bytes=32053248
|
||||
mode=wait size=64 polls=168 worker_cpu_ms=0.000 wall_ms=250.695 worker_allocated_bytes=5376
|
||||
mode=upstream size=64 polls=1001600 worker_cpu_ms=250.000 wall_ms=250.000 worker_allocated_bytes=32051200
|
||||
mode=wait size=64 polls=166 worker_cpu_ms=0.000 wall_ms=250.593 worker_allocated_bytes=5312
|
||||
mode=upstream size=64 polls=988856 worker_cpu_ms=234.375 wall_ms=250.000 worker_allocated_bytes=31643392
|
||||
mode=wait size=64 polls=171 worker_cpu_ms=0.000 wall_ms=250.557 worker_allocated_bytes=5472
|
||||
@@ -1,196 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Single fixed-order stationary Linux software-rendered pair; targeted allocation observation, not a statistical FPS/RAM comparison",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"graphics": "llvmpipe LLVM21.1.8 OpenGL, 1280x800",
|
||||
"captured_settings_match": true,
|
||||
"settings": {
|
||||
"render_distance": 12,
|
||||
"simulation_distance": 12,
|
||||
"lod_radius": 128,
|
||||
"lod_quality": "MEDIUM/MEDIUM BLOCK",
|
||||
"terrain_workers": 2,
|
||||
"runtime_ratio_start_and_end": 0.5,
|
||||
"world_difficulty": "PEACEFUL",
|
||||
"fov": 70,
|
||||
"heap_max": "3G",
|
||||
"collector": "G1",
|
||||
"compact_headers": true,
|
||||
"frame_limit": "uncapped",
|
||||
"other_original_controllers": false,
|
||||
"interruptible_terrain_read": true
|
||||
},
|
||||
"runs": [
|
||||
{
|
||||
"profile": "m2-balanced",
|
||||
"elapsed_seconds": 120.305371929,
|
||||
"frame_samples": 230,
|
||||
"tick_samples": 2401,
|
||||
"tick_elapsed_seconds": 120.040272048,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"frame_stats": {
|
||||
"count": 230,
|
||||
"meanMs": 519.2565329826086,
|
||||
"p50Ms": 492.583608,
|
||||
"p95Ms": 700.364095,
|
||||
"p99Ms": 803.28719,
|
||||
"maxMs": 955.16614,
|
||||
"meanRate": 1.9258303679994195,
|
||||
"lowOnePercentRate": 1.146414365311511,
|
||||
"over16Ms": 230,
|
||||
"over33Ms": 230,
|
||||
"over50Ms": 230,
|
||||
"over100Ms": 230
|
||||
},
|
||||
"tick_execution_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 9.248066071636819,
|
||||
"p50Ms": 8.529226,
|
||||
"p95Ms": 16.494711,
|
||||
"p99Ms": 23.483163,
|
||||
"maxMs": 65.248147,
|
||||
"meanRate": 108.13071535755256,
|
||||
"lowOnePercentRate": 29.893225023275733,
|
||||
"over16Ms": 113,
|
||||
"over33Ms": 9,
|
||||
"over50Ms": 2,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_cpu_seconds": 432.81,
|
||||
"process_rss_peak_sampled_bytes": 2898677760,
|
||||
"queue_wait": false,
|
||||
"wakeable_idle": false,
|
||||
"queue_allocation_counters": [
|
||||
{
|
||||
"thread_id": 86,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:overworld] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.391610411,
|
||||
"observed_allocated_bytes": 982644080,
|
||||
"observed_bytes_per_second": 15260436.471893786
|
||||
},
|
||||
{
|
||||
"thread_id": 93,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:the_end] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.391610411,
|
||||
"observed_allocated_bytes": 66520,
|
||||
"observed_bytes_per_second": 1033.0538338055978
|
||||
},
|
||||
{
|
||||
"thread_id": 98,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:the_nether] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.391610411,
|
||||
"observed_allocated_bytes": 66408,
|
||||
"observed_bytes_per_second": 1031.3144767793467
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 178.149902,
|
||||
"preceding_jfr_gc_pause_longest_ms": 34.011115,
|
||||
"world_save_and_exit_zero": true
|
||||
},
|
||||
{
|
||||
"profile": "queue-wait",
|
||||
"elapsed_seconds": 120.448597645,
|
||||
"frame_samples": 225,
|
||||
"tick_samples": 2401,
|
||||
"tick_elapsed_seconds": 120.040563501,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"frame_stats": {
|
||||
"count": 225,
|
||||
"meanMs": 529.5368389244444,
|
||||
"p50Ms": 502.825816,
|
||||
"p95Ms": 717.088739,
|
||||
"p99Ms": 798.871994,
|
||||
"maxMs": 843.221511,
|
||||
"meanRate": 1.8884427418328913,
|
||||
"lowOnePercentRate": 1.2159699757233216,
|
||||
"over16Ms": 225,
|
||||
"over33Ms": 225,
|
||||
"over50Ms": 225,
|
||||
"over100Ms": 225
|
||||
},
|
||||
"tick_execution_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 9.375896729279466,
|
||||
"p50Ms": 8.803401,
|
||||
"p95Ms": 16.938218,
|
||||
"p99Ms": 22.983944,
|
||||
"maxMs": 63.421671,
|
||||
"meanRate": 106.65646485601272,
|
||||
"lowOnePercentRate": 31.02504677094056,
|
||||
"over16Ms": 128,
|
||||
"over33Ms": 7,
|
||||
"over50Ms": 2,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_cpu_seconds": 430.67,
|
||||
"process_rss_peak_sampled_bytes": 2989219840,
|
||||
"queue_wait": true,
|
||||
"wakeable_idle": true,
|
||||
"queue_allocation_counters": [
|
||||
{
|
||||
"thread_id": 88,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:overworld] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.387296767,
|
||||
"observed_allocated_bytes": 739640,
|
||||
"observed_bytes_per_second": 11487.359108684974
|
||||
},
|
||||
{
|
||||
"thread_id": 93,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:the_nether] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.387296767,
|
||||
"observed_allocated_bytes": 0,
|
||||
"observed_bytes_per_second": 0.0
|
||||
},
|
||||
{
|
||||
"thread_id": 100,
|
||||
"thread": "DH-Chunk Update Queue [minecraft:the_end] Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.387296767,
|
||||
"observed_allocated_bytes": 0,
|
||||
"observed_bytes_per_second": 0.0
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 151.522451,
|
||||
"preceding_jfr_gc_pause_longest_ms": 47.79999,
|
||||
"world_save_and_exit_zero": true
|
||||
}
|
||||
],
|
||||
"provenance": {
|
||||
"production_mod_source_commit": "24c65f512dece83b153b206e33cd4c4294b42de2",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"initial_player_snapshot_sha256": "b4d11dbd6443625415a1e32aa242d0e2d09cd77ddb1becfde5d35cb6ab8d278a",
|
||||
"source_level_snapshot_sha256": "86a3c75ea993e50c4428da4dbadc5856688a9367f035c41b8bb49863a9aeb644",
|
||||
"first_saved_cameras_match": true,
|
||||
"saved_camera": {
|
||||
"position": [
|
||||
-56.5,
|
||||
69.0,
|
||||
55.5
|
||||
],
|
||||
"rotation": [
|
||||
141.5,
|
||||
16.950002670288086
|
||||
]
|
||||
}
|
||||
},
|
||||
"notes": [
|
||||
"Separate copies of the same private world; candidate then control. JFR begins about121seconds after demo dismissal; frame capture begins about307seconds after dismissal.",
|
||||
"JFR allocation counters span about64seconds; pause measurements are from the preceding JFR recordings, not the later frame capture.",
|
||||
"Recorded overworld queue allocation counter rate is about15.3MB/s upstream versus11.5KB/s with waiting. Task-completion and generated geometry volumes are not controlled quantitatively.",
|
||||
"Control has230frames versus225candidate; sampled peak RSS is lower in control, and later whole-process CPU differences are small. No game FPS, retained-memory or whole-process CPU improvement is established.",
|
||||
"Daylight advances normally; lighting, entity activity and cache/JIT differences are not fully controlled. No Apple Silicon or hardware-GPU result.",
|
||||
"Tick meanRate is inverse execution duration, not observed TPS. Both recordings contain2401tick execution samples over about120seconds.",
|
||||
"Actual JSON/CSV viewer comparisons and390pxlayout pass. The real discarded capture with zero eligible frames and209exclusions is rejected by the viewer and excluded from performance comparisons.",
|
||||
"No private worlds, full game logs or JFR recordings are published."
|
||||
]
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"submission_allocated_bytes": 216987192,
|
||||
"submission_cpu_ns": 372949442,
|
||||
"submission_wall_ns": 401548875,
|
||||
"rejections": 63790,
|
||||
"tasks_completed": 2,
|
||||
"occupied_slots": 0
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"submission_allocated_bytes": 103384,
|
||||
"submission_cpu_ns": 941367,
|
||||
"submission_wall_ns": 959453,
|
||||
"rejections": 6,
|
||||
"tasks_completed": 2,
|
||||
"occupied_slots": 0
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Synthetic full physical worker queue; both modes use the actual publisher dispatcher inside Fabric.",
|
||||
"Allocation and CPU measure the submission caller only; retry scheduler activity is excluded.",
|
||||
"Upstream keeps the caller blocked for the requested 200 ms observation window; patched returns earlier.",
|
||||
"Both modes verify exact task counts, recovered occupied slots and fixture worker shutdown.",
|
||||
"Not a game FPS, terrain completion, whole-game RAM, or hardware compatibility benchmark."
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,42 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Darwin 25.6.0 arm64; logical CPUs 3
|
||||
mode=upstream trial=0 incoming_after_idle_ms=26.655 publication_to_pop_ms=27.930
|
||||
mode=wakeable trial=0 incoming_after_idle_ms=23.086 publication_to_pop_ms=0.098
|
||||
mode=upstream trial=1 incoming_after_idle_ms=25.029 publication_to_pop_ms=94.707
|
||||
mode=wakeable trial=1 incoming_after_idle_ms=19.340 publication_to_pop_ms=16.096
|
||||
mode=upstream trial=2 incoming_after_idle_ms=16.530 publication_to_pop_ms=98.696
|
||||
mode=wakeable trial=2 incoming_after_idle_ms=12.085 publication_to_pop_ms=0.080
|
||||
mode=upstream trial=3 incoming_after_idle_ms=20.350 publication_to_pop_ms=50.086
|
||||
mode=wakeable trial=3 incoming_after_idle_ms=15.681 publication_to_pop_ms=0.051
|
||||
mode=upstream trial=4 incoming_after_idle_ms=26.474 publication_to_pop_ms=90.380
|
||||
mode=wakeable trial=4 incoming_after_idle_ms=21.794 publication_to_pop_ms=0.054
|
||||
mode=upstream trial=5 incoming_after_idle_ms=20.069 publication_to_pop_ms=91.508
|
||||
mode=wakeable trial=5 incoming_after_idle_ms=14.527 publication_to_pop_ms=0.069
|
||||
mode=upstream trial=6 incoming_after_idle_ms=25.051 publication_to_pop_ms=58.889
|
||||
mode=wakeable trial=6 incoming_after_idle_ms=20.193 publication_to_pop_ms=0.081
|
||||
mode=upstream trial=7 incoming_after_idle_ms=12.084 publication_to_pop_ms=41.323
|
||||
mode=wakeable trial=7 incoming_after_idle_ms=5.867 publication_to_pop_ms=0.057
|
||||
mode=upstream trial=8 incoming_after_idle_ms=19.023 publication_to_pop_ms=99.615
|
||||
mode=wakeable trial=8 incoming_after_idle_ms=18.833 publication_to_pop_ms=0.063
|
||||
mode=upstream trial=9 incoming_after_idle_ms=13.648 publication_to_pop_ms=103.446
|
||||
mode=wakeable trial=9 incoming_after_idle_ms=28.375 publication_to_pop_ms=0.056
|
||||
mode=upstream trial=10 incoming_after_idle_ms=17.449 publication_to_pop_ms=98.829
|
||||
mode=wakeable trial=10 incoming_after_idle_ms=24.812 publication_to_pop_ms=0.062
|
||||
mode=upstream trial=11 incoming_after_idle_ms=26.751 publication_to_pop_ms=88.715
|
||||
mode=wakeable trial=11 incoming_after_idle_ms=28.154 publication_to_pop_ms=0.067
|
||||
mode=upstream trial=12 incoming_after_idle_ms=20.596 publication_to_pop_ms=73.247
|
||||
mode=wakeable trial=12 incoming_after_idle_ms=16.397 publication_to_pop_ms=0.080
|
||||
mode=upstream trial=13 incoming_after_idle_ms=19.685 publication_to_pop_ms=53.674
|
||||
mode=wakeable trial=13 incoming_after_idle_ms=21.934 publication_to_pop_ms=0.050
|
||||
mode=upstream trial=14 incoming_after_idle_ms=16.937 publication_to_pop_ms=37.755
|
||||
mode=wakeable trial=14 incoming_after_idle_ms=18.296 publication_to_pop_ms=0.074
|
||||
mode=upstream trial=15 incoming_after_idle_ms=17.572 publication_to_pop_ms=68.115
|
||||
mode=wakeable trial=15 incoming_after_idle_ms=13.516 publication_to_pop_ms=0.072
|
||||
mode=upstream trial=16 incoming_after_idle_ms=24.639 publication_to_pop_ms=100.433
|
||||
mode=wakeable trial=16 incoming_after_idle_ms=22.918 publication_to_pop_ms=0.103
|
||||
mode=upstream trial=17 incoming_after_idle_ms=30.593 publication_to_pop_ms=79.830
|
||||
mode=wakeable trial=17 incoming_after_idle_ms=25.080 publication_to_pop_ms=0.053
|
||||
mode=upstream trial=18 incoming_after_idle_ms=15.889 publication_to_pop_ms=108.892
|
||||
mode=wakeable trial=18 incoming_after_idle_ms=27.297 publication_to_pop_ms=0.034
|
||||
mode=upstream trial=19 incoming_after_idle_ms=10.808 publication_to_pop_ms=59.234
|
||||
mode=wakeable trial=19 incoming_after_idle_ms=16.349 publication_to_pop_ms=0.083
|
||||
@@ -1,42 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Linux 6.17.0-1022-azure x86_64; logical CPUs 4
|
||||
mode=upstream trial=0 incoming_after_idle_ms=5.089 publication_to_pop_ms=45.143
|
||||
mode=wakeable trial=0 incoming_after_idle_ms=5.100 publication_to_pop_ms=0.073
|
||||
mode=upstream trial=1 incoming_after_idle_ms=5.125 publication_to_pop_ms=45.051
|
||||
mode=wakeable trial=1 incoming_after_idle_ms=5.097 publication_to_pop_ms=0.055
|
||||
mode=upstream trial=2 incoming_after_idle_ms=5.098 publication_to_pop_ms=45.135
|
||||
mode=wakeable trial=2 incoming_after_idle_ms=5.088 publication_to_pop_ms=0.042
|
||||
mode=upstream trial=3 incoming_after_idle_ms=5.091 publication_to_pop_ms=45.084
|
||||
mode=wakeable trial=3 incoming_after_idle_ms=5.149 publication_to_pop_ms=0.049
|
||||
mode=upstream trial=4 incoming_after_idle_ms=5.103 publication_to_pop_ms=45.060
|
||||
mode=wakeable trial=4 incoming_after_idle_ms=5.141 publication_to_pop_ms=0.064
|
||||
mode=upstream trial=5 incoming_after_idle_ms=5.127 publication_to_pop_ms=45.047
|
||||
mode=wakeable trial=5 incoming_after_idle_ms=5.137 publication_to_pop_ms=0.053
|
||||
mode=upstream trial=6 incoming_after_idle_ms=5.129 publication_to_pop_ms=45.177
|
||||
mode=wakeable trial=6 incoming_after_idle_ms=5.134 publication_to_pop_ms=0.068
|
||||
mode=upstream trial=7 incoming_after_idle_ms=5.107 publication_to_pop_ms=45.059
|
||||
mode=wakeable trial=7 incoming_after_idle_ms=5.137 publication_to_pop_ms=0.061
|
||||
mode=upstream trial=8 incoming_after_idle_ms=5.168 publication_to_pop_ms=45.005
|
||||
mode=wakeable trial=8 incoming_after_idle_ms=5.134 publication_to_pop_ms=0.060
|
||||
mode=upstream trial=9 incoming_after_idle_ms=5.105 publication_to_pop_ms=45.077
|
||||
mode=wakeable trial=9 incoming_after_idle_ms=5.148 publication_to_pop_ms=0.070
|
||||
mode=upstream trial=10 incoming_after_idle_ms=5.092 publication_to_pop_ms=45.197
|
||||
mode=wakeable trial=10 incoming_after_idle_ms=5.136 publication_to_pop_ms=0.055
|
||||
mode=upstream trial=11 incoming_after_idle_ms=5.113 publication_to_pop_ms=45.045
|
||||
mode=wakeable trial=11 incoming_after_idle_ms=5.122 publication_to_pop_ms=0.044
|
||||
mode=upstream trial=12 incoming_after_idle_ms=5.095 publication_to_pop_ms=45.070
|
||||
mode=wakeable trial=12 incoming_after_idle_ms=5.147 publication_to_pop_ms=0.052
|
||||
mode=upstream trial=13 incoming_after_idle_ms=5.118 publication_to_pop_ms=45.048
|
||||
mode=wakeable trial=13 incoming_after_idle_ms=5.168 publication_to_pop_ms=0.047
|
||||
mode=upstream trial=14 incoming_after_idle_ms=5.133 publication_to_pop_ms=45.129
|
||||
mode=wakeable trial=14 incoming_after_idle_ms=5.155 publication_to_pop_ms=0.047
|
||||
mode=upstream trial=15 incoming_after_idle_ms=5.098 publication_to_pop_ms=45.031
|
||||
mode=wakeable trial=15 incoming_after_idle_ms=5.167 publication_to_pop_ms=0.044
|
||||
mode=upstream trial=16 incoming_after_idle_ms=5.129 publication_to_pop_ms=45.051
|
||||
mode=wakeable trial=16 incoming_after_idle_ms=5.135 publication_to_pop_ms=0.073
|
||||
mode=upstream trial=17 incoming_after_idle_ms=5.148 publication_to_pop_ms=45.034
|
||||
mode=wakeable trial=17 incoming_after_idle_ms=5.148 publication_to_pop_ms=0.044
|
||||
mode=upstream trial=18 incoming_after_idle_ms=5.181 publication_to_pop_ms=45.103
|
||||
mode=wakeable trial=18 incoming_after_idle_ms=5.127 publication_to_pop_ms=0.046
|
||||
mode=upstream trial=19 incoming_after_idle_ms=5.094 publication_to_pop_ms=45.075
|
||||
mode=wakeable trial=19 incoming_after_idle_ms=5.148 publication_to_pop_ms=0.051
|
||||
@@ -1,42 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Windows 2025Server AMD64; logical CPUs 4
|
||||
mode=upstream trial=0 incoming_after_idle_ms=5.487 publication_to_pop_ms=45.519
|
||||
mode=wakeable trial=0 incoming_after_idle_ms=5.377 publication_to_pop_ms=0.127
|
||||
mode=upstream trial=1 incoming_after_idle_ms=6.059 publication_to_pop_ms=44.593
|
||||
mode=wakeable trial=1 incoming_after_idle_ms=5.539 publication_to_pop_ms=0.094
|
||||
mode=upstream trial=2 incoming_after_idle_ms=5.096 publication_to_pop_ms=45.005
|
||||
mode=wakeable trial=2 incoming_after_idle_ms=5.624 publication_to_pop_ms=0.079
|
||||
mode=upstream trial=3 incoming_after_idle_ms=5.649 publication_to_pop_ms=44.691
|
||||
mode=wakeable trial=3 incoming_after_idle_ms=4.731 publication_to_pop_ms=0.077
|
||||
mode=upstream trial=4 incoming_after_idle_ms=5.312 publication_to_pop_ms=45.488
|
||||
mode=wakeable trial=4 incoming_after_idle_ms=5.156 publication_to_pop_ms=0.108
|
||||
mode=upstream trial=5 incoming_after_idle_ms=5.190 publication_to_pop_ms=45.580
|
||||
mode=wakeable trial=5 incoming_after_idle_ms=5.457 publication_to_pop_ms=0.077
|
||||
mode=upstream trial=6 incoming_after_idle_ms=5.141 publication_to_pop_ms=45.619
|
||||
mode=wakeable trial=6 incoming_after_idle_ms=5.592 publication_to_pop_ms=0.074
|
||||
mode=upstream trial=7 incoming_after_idle_ms=5.823 publication_to_pop_ms=44.487
|
||||
mode=wakeable trial=7 incoming_after_idle_ms=5.355 publication_to_pop_ms=0.066
|
||||
mode=upstream trial=8 incoming_after_idle_ms=5.675 publication_to_pop_ms=45.050
|
||||
mode=wakeable trial=8 incoming_after_idle_ms=5.252 publication_to_pop_ms=0.075
|
||||
mode=upstream trial=9 incoming_after_idle_ms=5.921 publication_to_pop_ms=44.505
|
||||
mode=wakeable trial=9 incoming_after_idle_ms=6.002 publication_to_pop_ms=0.072
|
||||
mode=upstream trial=10 incoming_after_idle_ms=5.797 publication_to_pop_ms=44.517
|
||||
mode=wakeable trial=10 incoming_after_idle_ms=5.103 publication_to_pop_ms=0.070
|
||||
mode=upstream trial=11 incoming_after_idle_ms=5.115 publication_to_pop_ms=45.066
|
||||
mode=wakeable trial=11 incoming_after_idle_ms=5.638 publication_to_pop_ms=0.071
|
||||
mode=upstream trial=12 incoming_after_idle_ms=5.239 publication_to_pop_ms=45.538
|
||||
mode=wakeable trial=12 incoming_after_idle_ms=5.666 publication_to_pop_ms=0.083
|
||||
mode=upstream trial=13 incoming_after_idle_ms=5.136 publication_to_pop_ms=45.251
|
||||
mode=wakeable trial=13 incoming_after_idle_ms=4.163 publication_to_pop_ms=0.073
|
||||
mode=upstream trial=14 incoming_after_idle_ms=5.256 publication_to_pop_ms=46.048
|
||||
mode=wakeable trial=14 incoming_after_idle_ms=5.545 publication_to_pop_ms=0.074
|
||||
mode=upstream trial=15 incoming_after_idle_ms=4.239 publication_to_pop_ms=47.028
|
||||
mode=wakeable trial=15 incoming_after_idle_ms=5.292 publication_to_pop_ms=0.053
|
||||
mode=upstream trial=16 incoming_after_idle_ms=5.959 publication_to_pop_ms=45.046
|
||||
mode=wakeable trial=16 incoming_after_idle_ms=5.230 publication_to_pop_ms=0.182
|
||||
mode=upstream trial=17 incoming_after_idle_ms=5.153 publication_to_pop_ms=45.005
|
||||
mode=wakeable trial=17 incoming_after_idle_ms=5.220 publication_to_pop_ms=0.066
|
||||
mode=upstream trial=18 incoming_after_idle_ms=5.358 publication_to_pop_ms=46.008
|
||||
mode=wakeable trial=18 incoming_after_idle_ms=5.156 publication_to_pop_ms=0.062
|
||||
mode=upstream trial=19 incoming_after_idle_ms=4.370 publication_to_pop_ms=47.015
|
||||
mode=wakeable trial=19 incoming_after_idle_ms=5.162 publication_to_pop_ms=0.073
|
||||
@@ -1,930 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Failed hosted macOS Vulkan graphics probes, not performance measurements",
|
||||
"source_commit": "8282a731ecc08691f798a3ec596c7cc1d4f1dad1",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37193558884",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"baseline",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"core-performance",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Apple Paravirtual device and MoltenVK on a hosted ARM Mac; not physical M2 Pro GPU testing.",
|
||||
"Library/device creation and readback request were observed, but no completed nonuniform readback report was produced.",
|
||||
"All failures retained; neither successful rendering nor a screenshot-specific root cause is established.",
|
||||
"Baseline includes the same original measurement mod and private test fixture; no core optimization mods or distant terrain.",
|
||||
"Full logs, screenshots, game binaries and assets remain private.",
|
||||
"Later selected stack locations place the observed failures in the screenshot callback; the independently logged Vulkan identifier is not established as their cause.",
|
||||
"Actual assertions rejected uniform callback images in all three cases. Overlay state was not recorded, and displayed-window correctness is not established.",
|
||||
"After guarding overlays, core/distant-terrain title readbacks pass but vanilla remains uniform; the aggregate research run fails. No world-rendering or physical-M2 claim.",
|
||||
"Later world probes pass all three Vulkan cases on the hosted Mac; failed title cases remain retained. These are short startup/readback/save probes, not physical-GPU performance tests."
|
||||
],
|
||||
"later_stack_run": {
|
||||
"source_commit": "a77476b54e7bf4a1b3a96cb9d8108ed7c1c7b2b0",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37193954843",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"baseline",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"core-performance",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"later_pixel_run": {
|
||||
"source_commit": "213498c77ed643617083dacf4aaa283a1cb4815a",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37194354615",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"baseline",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"readback_callback_received": true,
|
||||
"readback_inspections": [
|
||||
{
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1
|
||||
}
|
||||
],
|
||||
"probe_failure_categories": [
|
||||
"uniform_readback"
|
||||
],
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"core-performance",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"readback_callback_received": true,
|
||||
"readback_inspections": [
|
||||
{
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1
|
||||
}
|
||||
],
|
||||
"probe_failure_categories": [
|
||||
"uniform_readback"
|
||||
],
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"readback_callback_received": true,
|
||||
"readback_inspections": [
|
||||
{
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1
|
||||
}
|
||||
],
|
||||
"probe_failure_categories": [
|
||||
"uniform_readback"
|
||||
],
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"later_overlay_run": {
|
||||
"source_commit": "a1d8c1b8246008ac4076cdcaf0f64c71eaf4c767",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37194690645",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"baseline",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"readback_callback_received": true,
|
||||
"readback_inspections": [
|
||||
{
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1
|
||||
}
|
||||
],
|
||||
"probe_failure_categories": [
|
||||
"uniform_readback"
|
||||
],
|
||||
"vulkan_error_codes": [
|
||||
"VK_ERROR_FEATURE_NOT_PRESENT"
|
||||
],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
],
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"core-performance",
|
||||
"--backend",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"report": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "title",
|
||||
"title_screen_observed": true,
|
||||
"world_loaded": false,
|
||||
"ready_client_ticks": 42,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 105,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 163,
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2",
|
||||
"private_png_sha256": "3c802923766cf9e7f45020bc2d858c23de655cb8e35fa058a050e7b09a1d3708",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"vulkan"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"report": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "title",
|
||||
"title_screen_observed": true,
|
||||
"world_loaded": false,
|
||||
"ready_client_ticks": 42,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 122,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 163,
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2",
|
||||
"private_png_sha256": "3c802923766cf9e7f45020bc2d858c23de655cb8e35fa058a050e7b09a1d3708",
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"later_world_run": {
|
||||
"source_commit": "5f9f973295c5cc948a6999a849c2c843f5e831f6",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37195149166",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"baseline",
|
||||
"--backend",
|
||||
"vulkan",
|
||||
"--world"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"report": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 42,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 323,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1278,
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2",
|
||||
"private_png_sha256": "9e9be2562390f24fe8c8e0442ef9cdfd47910febd95d8f0c0f5706191a53f1f6",
|
||||
"profile": "baseline",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"core-performance",
|
||||
"--backend",
|
||||
"vulkan",
|
||||
"--world"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"report": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 51,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 90,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1024,
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2",
|
||||
"private_png_sha256": "e0a6ad253ca0490b35217ce9ad799dc7d4c04e4ecf446eeacd1aa5196db317bb",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"vulkan",
|
||||
"--world"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"report": {
|
||||
"schema": 1,
|
||||
"platform": "macOS-26.6.2-arm64-arm-64bit",
|
||||
"architecture": "arm64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 53,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 88,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 646,
|
||||
"sampled_pixels": 4160,
|
||||
"distinct_sampled_rgb": 1287,
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2",
|
||||
"private_png_sha256": "a17d1740e34cc9f49b67a4c56f51d0843f756e9d2eb3d19d6a926ad5f8f0ed36",
|
||||
"profile": "vulkan",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"local_linux_core_vulkan_world": {
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 47,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 111,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1895,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.4.335 llvmpipe Mesa 26.0.8-1ubuntu0.3 (LLVM 21.1.8)",
|
||||
"private_png_sha256": "52b26102b3037cab4ab6b7011a6c1255eebaa808d1d3dd5e77ff23fcde092acb",
|
||||
"profile": "core-performance",
|
||||
"preferred_backend": "vulkan",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Darwin 25.6.0 arm64; logical CPUs 3
|
||||
fork=0 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=0 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=1 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=1 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=2 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=2 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
@@ -1,104 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Linux 6.17.0-1022-azure x86_64; logical CPUs 4
|
||||
fork=0 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=0 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=1 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=1 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=2 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=2 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
@@ -1,104 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Windows 2025Server AMD64; logical CPUs 4
|
||||
fork=0 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=0 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=1 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=1 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
fork=2 requested_compact_headers=False
|
||||
compact_object_headers=false
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=AABB objects=100000 allocated_bytes=6400000 bytes_per_object=64.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=Vec3 objects=100000 allocated_bytes=4000000 bytes_per_object=40.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
fork=2 requested_compact_headers=True
|
||||
compact_object_headers=true
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=AABB objects=100000 allocated_bytes=5600000 bytes_per_object=56.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=Vec3 objects=100000 allocated_bytes=3200000 bytes_per_object=32.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=DhChunkPos objects=100000 allocated_bytes=2400000 bytes_per_object=24.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Long objects=100000 allocated_bytes=1600000 bytes_per_object=16.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
type=Object objects=100000 allocated_bytes=800000 bytes_per_object=8.000
|
||||
@@ -1,67 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"purpose": "Earlier private quad-reuse explorations; CPU mixed and allocation reduction is not retained RAM/FPS",
|
||||
"original_mod_sha256": "98f8db7ca8962a71625eef835f57d25c8afb802f2cf1b7c4c832fc070757e011",
|
||||
"private_fixture_sources": "Uncommitted private prototype before the production-hook fixture; not the final reproducible protocol",
|
||||
"observations": [
|
||||
{
|
||||
"private_probe": "latest-discarded-object",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "31509677879305c6a721677b38516fda0336f8c7b53dc3946839eb6fbf7fd0ee",
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 166481448,
|
||||
"allocated_bytes": 144576000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 54349387,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 84133914,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 27998147,
|
||||
"allocated_bytes": 48192000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "31509677879305c6a721677b38516fda0336f8c7b53dc3946839eb6fbf7fd0ee",
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 185505067,
|
||||
"allocated_bytes": 2016000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 59897923,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 63778316,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 61828828,
|
||||
"allocated_bytes": 672000
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"private_probe": "first-discarded-object",
|
||||
"results": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "8251175aa3e3cac30bb1366f8b40d0576c17978076ea7d244ff4d7cc361da7ee",
|
||||
"thread_geometry_digest": "096a85be06031d248f12e536e19e5c0496bb00c80f3387f670a0fae29438a732",
|
||||
"thread_workers": 4,
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 40437624,
|
||||
"allocated_bytes": 144576000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 13455029,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 13828075,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 13154520,
|
||||
"allocated_bytes": 48192000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "8251175aa3e3cac30bb1366f8b40d0576c17978076ea7d244ff4d7cc361da7ee",
|
||||
"thread_geometry_digest": "096a85be06031d248f12e536e19e5c0496bb00c80f3387f670a0fae29438a732",
|
||||
"thread_workers": 4,
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 44074799,
|
||||
"allocated_bytes": 2016000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 16004752,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 14047833,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 14022214,
|
||||
"allocated_bytes": 672000
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual publisher quad builder inside Fabric with generated faces and lighting/material values.",
|
||||
"Opaque/translucent geometry, pooled error flags and every retained quad field match before and after upstream merging.",
|
||||
"Fresh allocations reuse at most one discarded successful-premerge quad; existing pool selection stays upstream.",
|
||||
"Three sequential warmed caller-loop observations are not independent forks; compilation can vary.",
|
||||
"Allocation reduction is not retained RAM, game FPS or a Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "0a0cd667d5cfdee7c59f5fe2c7a2eb15bd19e66e",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37175709062"
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"platform": "Linux x86_64",
|
||||
"graphics": "llvmpipe software OpenGL",
|
||||
"settings": {
|
||||
"heap_bytes": 3221225472,
|
||||
"gc": "G1",
|
||||
"compact_headers": true,
|
||||
"render_distance": 12,
|
||||
"simulation_distance": 12,
|
||||
"lod_radius_chunks": 128,
|
||||
"lod_quality": "MEDIUM/MEDIUM/BLOCK",
|
||||
"terrain_workers": 2,
|
||||
"runtime_ratio": 0.5,
|
||||
"world_difficulty": "PEACEFUL"
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"profile": "m2-balanced",
|
||||
"quad_reuse_enabled": false,
|
||||
"elapsed_seconds": 120.415309971,
|
||||
"frame_samples": 220,
|
||||
"tick_samples": 2400,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 220,
|
||||
"meanMs": 542.3438610045455,
|
||||
"p50Ms": 522.365908,
|
||||
"p95Ms": 713.237831,
|
||||
"p99Ms": 860.91664,
|
||||
"maxMs": 885.115974,
|
||||
"meanRate": 1.8438486574693962,
|
||||
"lowOnePercentRate": 1.1446485854821962,
|
||||
"over16Ms": 220,
|
||||
"over33Ms": 220,
|
||||
"over50Ms": 220,
|
||||
"over100Ms": 220
|
||||
},
|
||||
"tick_stats": {
|
||||
"count": 2400,
|
||||
"meanMs": 9.639125558749999,
|
||||
"p50Ms": 9.137695,
|
||||
"p95Ms": 16.989389,
|
||||
"p99Ms": 25.152306,
|
||||
"maxMs": 52.879001,
|
||||
"meanRate": 103.74385040479541,
|
||||
"lowOnePercentRate": 30.37834831626593,
|
||||
"over16Ms": 133,
|
||||
"over33Ms": 8,
|
||||
"over50Ms": 2,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_rss_peak_sampled_bytes": 3129790464,
|
||||
"render_loader_allocation_counters": [
|
||||
{
|
||||
"thread_id": 124,
|
||||
"thread": "DH-Render Loader Thread[1]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.375191422,
|
||||
"observed_allocated_bytes": 97869576,
|
||||
"observed_bytes_per_second": 1520299.5725237317
|
||||
},
|
||||
{
|
||||
"thread_id": 123,
|
||||
"thread": "DH-Render Loader Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.375191422,
|
||||
"observed_allocated_bytes": 91443128,
|
||||
"observed_bytes_per_second": 1420471.5509203072
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 263.975028,
|
||||
"preceding_jfr_gc_pause_longest_ms": 45.0698
|
||||
},
|
||||
{
|
||||
"profile": "quad-reuse",
|
||||
"quad_reuse_enabled": true,
|
||||
"elapsed_seconds": 120.476138714,
|
||||
"frame_samples": 224,
|
||||
"tick_samples": 2401,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 224,
|
||||
"meanMs": 532.6331643258928,
|
||||
"p50Ms": 505.6209,
|
||||
"p95Ms": 735.235244,
|
||||
"p99Ms": 774.189261,
|
||||
"maxMs": 926.006251,
|
||||
"meanRate": 1.8774647674551252,
|
||||
"lowOnePercentRate": 1.208934822852848,
|
||||
"over16Ms": 224,
|
||||
"over33Ms": 224,
|
||||
"over50Ms": 224,
|
||||
"over100Ms": 224
|
||||
},
|
||||
"tick_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 9.308558193669304,
|
||||
"p50Ms": 8.82277,
|
||||
"p95Ms": 16.529268,
|
||||
"p99Ms": 22.206144,
|
||||
"maxMs": 95.741877,
|
||||
"meanRate": 107.42802259968617,
|
||||
"lowOnePercentRate": 30.32324112917506,
|
||||
"over16Ms": 114,
|
||||
"over33Ms": 8,
|
||||
"over50Ms": 3,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_rss_peak_sampled_bytes": 3100016640,
|
||||
"render_loader_allocation_counters": [
|
||||
{
|
||||
"thread_id": 125,
|
||||
"thread": "DH-Render Loader Thread[1]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.347664971,
|
||||
"observed_allocated_bytes": 116155920,
|
||||
"observed_bytes_per_second": 1805130.3035214841
|
||||
},
|
||||
{
|
||||
"thread_id": 124,
|
||||
"thread": "DH-Render Loader Thread[0]",
|
||||
"counter_observations": 2,
|
||||
"observed_seconds": 64.347664971,
|
||||
"observed_allocated_bytes": 104401656,
|
||||
"observed_bytes_per_second": 1622462.229935638
|
||||
}
|
||||
],
|
||||
"preceding_jfr_gc_pause_total_ms": 166.770211,
|
||||
"preceding_jfr_gc_pause_longest_ms": 46.786101
|
||||
}
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "0a0cd667d5cfdee7c59f5fe2c7a2eb15bd19e66e",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37175709062",
|
||||
"runtime_mod_matches_linux_ci": true,
|
||||
"initial_player_snapshot_sha256": "b4d11dbd6443625415a1e32aa242d0e2d09cd77ddb1becfde5d35cb6ab8d278a",
|
||||
"source_level_snapshot_sha256": "86a3c75ea993e50c4428da4dbadc5856688a9367f035c41b8bb49863a9aeb644",
|
||||
"first_saved_player_position": [
|
||||
-56.5,
|
||||
69.0,
|
||||
55.5
|
||||
],
|
||||
"first_saved_player_rotation": [
|
||||
141.5,
|
||||
16.950002670288086
|
||||
],
|
||||
"first_saved_cameras_matched": true
|
||||
},
|
||||
"notes": [
|
||||
"Fixed-order candidate then control single pair from separate copies of the same private world. Both stationary captures start approximately 307 seconds after the demo popup is dismissed; first saved cameras match.",
|
||||
"Both reports have zero menu/pause/focus exclusions, no dropped samples and matching captured settings apart from the isolated quad hook. CSV counts and actual offline viewer timelines pass.",
|
||||
"The preceding 60-second JFR recordings begin approximately 121 seconds after dismissal. Allocation counters have their own approximately 64-second spans; GC pause data is from those recordings, not from the later frame captures.",
|
||||
"Render-loader allocation counter rates are higher in this candidate observation. Task-completion/geometry volumes and cache/JIT effects are not controlled quantitatively. No useful live allocation improvement is established.",
|
||||
"Frame count and sampled peak RSS differences in this single software-rendered pair do not establish a meaningful game speed or retained-memory gain. RSS is not complete GPU/unified RAM. Not an Apple Silicon benchmark.",
|
||||
"Candidate saved, reloaded, saved again and exited with launcher code zero. Control saved, closed all terrain databases and exited with launcher code zero.",
|
||||
"No private worlds, full game logs or JFR recordings are included in these selected observations."
|
||||
]
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "8251175aa3e3cac30bb1366f8b40d0576c17978076ea7d244ff4d7cc361da7ee",
|
||||
"thread_geometry_digest": "096a85be06031d248f12e536e19e5c0496bb00c80f3387f670a0fae29438a732",
|
||||
"thread_workers": 4,
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 198847198,
|
||||
"allocated_bytes": 144576000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 82119774,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 60671068,
|
||||
"allocated_bytes": 48192000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 56056356,
|
||||
"allocated_bytes": 48192000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"geometry_digest": "8251175aa3e3cac30bb1366f8b40d0576c17978076ea7d244ff4d7cc361da7ee",
|
||||
"thread_geometry_digest": "096a85be06031d248f12e536e19e5c0496bb00c80f3387f670a0fae29438a732",
|
||||
"thread_workers": 4,
|
||||
"geometry_quads": 108358,
|
||||
"input_faces": 55296,
|
||||
"measured_faces": 3072000,
|
||||
"checksum": 60000,
|
||||
"cpu_ns": 178894413,
|
||||
"allocated_bytes": 2016000,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 60070905,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 60020252,
|
||||
"allocated_bytes": 672000
|
||||
},
|
||||
{
|
||||
"cpu_ns": 58803256,
|
||||
"allocated_bytes": 672000
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual publisher quad builder inside Fabric with generated faces and lighting/material values.",
|
||||
"Opaque/translucent geometry, pooled error flags and every retained quad field match before and after upstream merging.",
|
||||
"Fresh allocations reuse at most one discarded successful-premerge quad; existing pool selection stays upstream.",
|
||||
"Three sequential warmed caller-loop observations are not independent forks; compilation can vary.",
|
||||
"Allocation reduction is not retained RAM, game FPS or a Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "0a0cd667d5cfdee7c59f5fe2c7a2eb15bd19e66e",
|
||||
"fixture_protocol": "55,296 generated faces plus four concurrent builders, geometry/list boundaries checked before and after upstream merge; warm 2,000 batches, then 500 warm batches and 2,000 measured batches per sequential observation, 512 faces/batch"
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"compact_headers": false,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 56,
|
||||
"pending_scratch_shallow_bytes": 0,
|
||||
"geometry_quads": 1,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"object_alignment_bytes": 8,
|
||||
"compressed_oops": true,
|
||||
"compressed_class_pointers": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"compact_headers": false,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 56,
|
||||
"pending_scratch_shallow_bytes": 56,
|
||||
"geometry_quads": 1,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"object_alignment_bytes": 8,
|
||||
"compressed_oops": true,
|
||||
"compressed_class_pointers": true
|
||||
},
|
||||
{
|
||||
"enabled": false,
|
||||
"compact_headers": true,
|
||||
"builder_shallow_bytes": 40,
|
||||
"quad_shallow_bytes": 48,
|
||||
"pending_scratch_shallow_bytes": 0,
|
||||
"geometry_quads": 1,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"object_alignment_bytes": 8,
|
||||
"compressed_oops": true,
|
||||
"compressed_class_pointers": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"compact_headers": true,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 48,
|
||||
"pending_scratch_shallow_bytes": 48,
|
||||
"geometry_quads": 1,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"object_alignment_bytes": 8,
|
||||
"compressed_oops": true,
|
||||
"compressed_class_pointers": true
|
||||
}
|
||||
],
|
||||
"differences": [
|
||||
{
|
||||
"compact_headers": false,
|
||||
"additional_builder_shallow_bytes": 0,
|
||||
"additional_builder_and_scratch_bytes": 56
|
||||
},
|
||||
{
|
||||
"compact_headers": true,
|
||||
"additional_builder_shallow_bytes": 8,
|
||||
"additional_builder_and_scratch_bytes": 56
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Instrumentation.getObjectSize measures shallow object sizes inside real applied Fabric clients.",
|
||||
"Four adjacent north-facing quads premerge to one retained geometry quad in each combination.",
|
||||
"Builder plus pending scratch difference excludes referenced lists, existing pools and every other game object.",
|
||||
"Object alignment/header/compressed-reference settings can differ on other JVMs or architectures.",
|
||||
"Not deep heap, GC residency, whole-game RSS/unified RAM, FPS or Apple Silicon performance.",
|
||||
"The agent and fixture are private test binaries excluded from playable packs."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "1243e148d455cd83f18b66f70bcfe2b8a4b746c9",
|
||||
"four_processes_exited_successfully": true,
|
||||
"agent_path_with_spaces_verified_separately": true
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Instrumentation.getObjectSize inside four private applied Fabric clients",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"original_mod_sha256": "2196637c5b2180a33fa5b926ab51069ab480618c1186b8a02872c7e758be0a70",
|
||||
"production_source_commit": "24c65f512dece83b153b206e33cd4c4294b42de2",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"compact_headers": false,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 56,
|
||||
"pending_scratch_shallow_bytes": 0,
|
||||
"geometry_quads": 1
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"compact_headers": false,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 56,
|
||||
"pending_scratch_shallow_bytes": 56,
|
||||
"geometry_quads": 1
|
||||
},
|
||||
{
|
||||
"enabled": false,
|
||||
"compact_headers": true,
|
||||
"builder_shallow_bytes": 40,
|
||||
"quad_shallow_bytes": 48,
|
||||
"pending_scratch_shallow_bytes": 0,
|
||||
"geometry_quads": 1
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"compact_headers": true,
|
||||
"builder_shallow_bytes": 48,
|
||||
"quad_shallow_bytes": 48,
|
||||
"pending_scratch_shallow_bytes": 48,
|
||||
"geometry_quads": 1
|
||||
}
|
||||
],
|
||||
"differences": [
|
||||
{
|
||||
"compact_headers": false,
|
||||
"additional_builder_shallow_bytes": 0,
|
||||
"additional_builder_and_scratch_bytes": 56
|
||||
},
|
||||
{
|
||||
"compact_headers": true,
|
||||
"additional_builder_shallow_bytes": 8,
|
||||
"additional_builder_and_scratch_bytes": 56
|
||||
}
|
||||
],
|
||||
"provenance": {
|
||||
"protocol": "Initial private size agent and corrected system-loader reflection probe; metadata was later expanded in the reusable source.",
|
||||
"agent_source_sha256": "4783850bf80e9eb0379570bb7794a610406b48bddd7fe36ff499222d01e789b1",
|
||||
"fixture_source_sha256": "842514f97116a1e9cf5eb9a4b951657c90f7639effdfd526357831e2424282bf"
|
||||
},
|
||||
"notes": [
|
||||
"Shallow object sizes only, not a heap walk or whole-game memory measurement.",
|
||||
"Four north-facing adjacent quads produce one retained geometry quad in every process.",
|
||||
"Header modes use separate upstream/patched JVMs.",
|
||||
"Layouts can differ with JVM, architecture, compressed references and object alignment.",
|
||||
"The hook remains optional; these sizes do not establish an FPS or RAM improvement.",
|
||||
"No test agent binaries, game binaries, private worlds, full logs or JFR recordings are published."
|
||||
]
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"resource_models": 2883,
|
||||
"graph_fixtures": 440,
|
||||
"rejected_roots": 1039,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaModelBakingOracle.java": "d05e04d25ed5e5aef260ce21cac627a79bdc5376326a5cb34ffb98462b79c79b",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"tools/test_model_baking_parity.py": "392ffec44918fb91740ca4a1316d684480d39f14bd34d46175f7f44946d15bd7",
|
||||
"tools/test_cuboid_model_parity.py": "4a8b1cdcac335751c23413341ae939eea1c49c38d33d70d0708b8904ab8d0461",
|
||||
"tools/test_model_resolution_parity.py": "d9595f2f1442f1f590b72d2a46600657e79ae103bec3d4c45db98242b964bde0",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-assets/Cargo.toml": "2f2cffacec0b4e22dd7cb032d594289bc51c94ae6cc4e985fee3e310f441d751",
|
||||
"crates/horizon-assets/examples/blockstate_binding_fixture.rs": "e58fdb432f6bfc1e400729baa9b48d4f00955b3143b98b52506b47dd8b065cf8",
|
||||
"crates/horizon-assets/examples/blockstate_model_fixture.rs": "8f063322e57abdf9361a5a3a3badce2a7e727ee6d5e3947071cb448dfb38e8fd",
|
||||
"crates/horizon-assets/examples/cuboid_model_fixture.rs": "97609d90e3f6ce340f3590296db2dc778113bb2b33c7d1b54080a1d6f3023f40",
|
||||
"crates/horizon-assets/examples/model_baking_fixture.rs": "a762a8b48f09b5ac5e9c48d4a578b18b700810807fe5d3fc50798365cce1c314",
|
||||
"crates/horizon-assets/examples/model_choice_fixture.rs": "a4c8a46501d2b5ae7051f10f2307ade048e96c2d330af51cd2431bb44977a99a",
|
||||
"crates/horizon-assets/examples/model_resolution_fixture.rs": "c071067140299e49345a6ebd94e15b3b6d853cb9ae11d8de46e3cbdfb8b01f0e",
|
||||
"crates/horizon-assets/examples/sprite_animation_fixture.rs": "254314d52deda129ab461221d3d8b95323a60730d374e566c1cd599fba85f072",
|
||||
"crates/horizon-assets/examples/support/mod.rs": "bcf5a6d8a54845982191e037911c24139237771d6afa4b01b1e83c011489c3f5",
|
||||
"crates/horizon-assets/src/animation.rs": "ebbf7952146a0e66b41396174492f5702627170b03a57e6cd5a45c97a08c975e",
|
||||
"crates/horizon-assets/src/bake/transform.rs": "a95e658fef85b21bcb2f9f7512f98f98d57022d62c1199885b7133beae35a09d",
|
||||
"crates/horizon-assets/src/bake.rs": "f55dda6b6cee5ac6e65a8ee4837fdd2c6674437d59e59b4c45718f6324d4a4d5",
|
||||
"crates/horizon-assets/src/blockstate/bind.rs": "6278962e55c9786bba8184bdf2939af9c6e3b9002b08c3022129964b49a60009",
|
||||
"crates/horizon-assets/src/blockstate/choice.rs": "5a66c8b9833e2f19dd8b0773f3593d97ff5941d3c5b773896b98049efa1395ba",
|
||||
"crates/horizon-assets/src/blockstate.rs": "a4299dfd7adaeb4173982ffaa8e9c9eda2925739ae579a714193c99da2e7ce56",
|
||||
"crates/horizon-assets/src/json.rs": "99fe8af4fbf5d4eed408a92e829ac1a39597a0d92471a6bff73771fad9c830a8",
|
||||
"crates/horizon-assets/src/lib.rs": "e39f21c59a2c3e1c53d977b29bd5e0638e5fc41d86ff0fcc1882a6d90fd961e4",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-model-baking-parity/inputs.jsonl": "aba24d38f4fc1af060502f983923c2f279c016d0fd412d40f6d50093fac1d811"
|
||||
},
|
||||
"rust_output_sha256": "9216be3bbae9e59bb89b6ed780ccedc5608cd4583c8e7527e50b165a0d8d30da",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "9216be3bbae9e59bb89b6ed780ccedc5608cd4583c8e7527e50b165a0d8d30da",
|
||||
"matched_output_lines": 7100
|
||||
}
|
||||
],
|
||||
"scope": "Actual client FaceBakery geometry overload with a real unit-atlas sprite and default JOML math options. Identity blockstate transform, all bundled cuboid geometry and synthetic rotations, rescaling, default/explicit UVs, winding, degenerate and reversed bounds, inherited models and missing materials. Positions, UVs and element matrix coefficients compare by float bits. This does not cover blockstate transforms/UV lock, atlas packing, transparency classification, lighting, GPU rendering or gameplay."
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"commands": {
|
||||
"position": 12375,
|
||||
"legacy": 23,
|
||||
"xoroshiro": 23,
|
||||
"xoroshiro_state": 5,
|
||||
"storage": 274
|
||||
},
|
||||
"inputs_sha256": "dbdebadd4b14ec57d198d22f15e196e0cc9a6b88bac6691db702348a769459c1",
|
||||
"rust_output_sha256": "7801e3274307aab1852d96d996d7f29b1ca1567750d231c5f74c9e3263f84f87",
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCoreOracle.java": "649b8353fcc3c45a3baf8e2d78dc76cfedfd96de36030b0dddfb2305829cd844",
|
||||
"tools/test_rust_parity.py": "d2d06842abb80d9c718a5bf0e71ab0c098ad4c519b8ef35711e30cf58af140d7",
|
||||
"crates/horizon-core/src/bin/parity.rs": "7b455f2181862e1430e7387633c146877c2d317c2ea682c1e6fa64345dbc5885",
|
||||
"crates/horizon-core/src/lib.rs": "deb2e339f78c9f5bd55a1c8a8428f3e37fae93a02268f9a2fc782dc3e27c2869",
|
||||
"crates/horizon-core/src/position.rs": "8c2a54e912f8c31a774682b3377ca5f2138910350fbf605e760b24e2cbcacfba",
|
||||
"crates/horizon-core/src/random.rs": "2f304dfb580a6bc1b5c51b048a2fa2a57f73c5f28f5eb2447f925bf138513389",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/Cargo.toml": "1928b71e389c24c506804f0d8e3104976da6feb27d9bfdbb3b55fb7af0c62664",
|
||||
"Cargo.toml": "9ca59fba126895de9e58952eb5e9421bee0ffdfb5f6d2fcb03d7726e394e7c3f",
|
||||
"Cargo.lock": "f2b104dbb3f64512b6c72e8d8732b7adda849212689e8c816f9a6abf564f4660"
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "7801e3274307aab1852d96d996d7f29b1ca1567750d231c5f74c9e3263f84f87",
|
||||
"matched_output_lines": 1017920
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "7801e3274307aab1852d96d996d7f29b1ca1567750d231c5f74c9e3263f84f87",
|
||||
"matched_output_lines": 1017920
|
||||
}
|
||||
],
|
||||
"scope": "Selected integer position, seeded RNG and packed-storage operations only. No gameplay, rendering or performance claim."
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"resource_models": 2883,
|
||||
"synthetic_models": 2337,
|
||||
"rejected_models": 1034,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"tools/test_cuboid_model_parity.py": "3b7c018570b0f609aae43cef60ff3139c543d5d629be804a5aa257e3ab2dd67c",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "7b4ab0ffa35af7ea8b6e38525f18ff6c3e94768198915f5ffe560d84263423f8",
|
||||
"crates/horizon-assets/Cargo.toml": "fadb78cf819e026500606c45d27138ed67fcbbc967ae8cee6c1e7c82c9046b36",
|
||||
"crates/horizon-assets/examples/cuboid_model_fixture.rs": "97609d90e3f6ce340f3590296db2dc778113bb2b33c7d1b54080a1d6f3023f40",
|
||||
"crates/horizon-assets/examples/model_resolution_fixture.rs": "c071067140299e49345a6ebd94e15b3b6d853cb9ae11d8de46e3cbdfb8b01f0e",
|
||||
"crates/horizon-assets/examples/support/mod.rs": "bcf5a6d8a54845982191e037911c24139237771d6afa4b01b1e83c011489c3f5",
|
||||
"crates/horizon-assets/src/json.rs": "e7b89bf4852f561a0e5bf1a984857c61e755961dfd86fcc326b6d55558615f39",
|
||||
"crates/horizon-assets/src/lib.rs": "0d31dd0fa84d7b4467a78a1a2b8a8e179533ef5e64a7cbae88e5358e59160a40",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-cuboid-model-parity/inputs.jsonl": "9c1822180e1d6869e65eea81a38cbcf3786b9286d4c839e31ba686501694d171"
|
||||
},
|
||||
"rust_output_sha256": "80c4b305084658ab968ed466fb1609bfa78d60738d09790c6243b4de27dfb8fc",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "80c4b305084658ab968ed466fb1609bfa78d60738d09790c6243b4de27dfb8fc",
|
||||
"matched_output_lines": 5220
|
||||
}
|
||||
],
|
||||
"scope": "Actual pinned CuboidModel.fromStream parser compared over every bundled block model and synthetic JSON/numeric/syntax cases. Decoded geometry, texture materials/references, nullable children, inheritance markers, face quadrants, light emission and display transforms; floats compare by IEEE-754 bits. Rejections normalize exception text. This client-only API is absent from the server. Does not yet validate parent resolution, rotation matrices, quad baking, blockstate dispatch, rendered pixels or gameplay."
|
||||
}
|
||||
@@ -1,373 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"exhaustive": false,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFloatLogOracle.java": "1794510183faa07892761e93094301b69665d4b6a5300ef7117b5482832165f2",
|
||||
"tools/test_float_log_parity.py": "1ba733163133ea6232a9021fcee5b38255887d62ebab8d1b42e4ccad259b21f3",
|
||||
"tools/test_rust_parity.py": "7efa699a38c5820424f5fc8992ee601dbfe26d6482da9d2dab2c17c41fe8f12a",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "ca79feb1ff690557a54dcb3a504967453dd0190ac65d7322512c778048127c5e",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "e42a19893a8d75f8f62b564bd9e527131d87fb469c808422fb8d3b14eb9edac0",
|
||||
"crates/horizon-core/src/density/cache.rs": "3ccc1268dca96259890279e9f91cb7a099c74b12e6ca2973880d4fa246f7a619",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ede1da60dec40f6df846e44a663bff03c21631c21f2b6e25a58c358115f122a1",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "47f1716a8b5fffc1012b9e4654e223b0ff818f00f6a059818ab3dfe8c37e3056",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "3034eccba649851d7a95e276a48472efd70cdf747b54526b565fb0feb88ce43a",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "3e56cc0f6b51c6faa4bd8d9fc259bf01a0c3bf647f36be8be7640971cfe3b334",
|
||||
"crates/horizon-core/src/density/power.rs": "b18a5b0d524de52a3d1e6028adcddd183424be2913f24d3f098ff56c5e1c6942",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "de22acd7430df3f69ef3632d427c57dffe57f3bdb78950bc75eac7e179ccf9df",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "3968e2a337a6a23226c485057c79359e66df16683f00fb4ebc9fabb03910a015",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random.rs": "92135a94c79111cc810b4b071dbd76043ee47c2585fd431e7486ea381f19e5db",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "84852599dde78687d782f115a5b4b3ef6856c1f9cc92917255167e89c72ab01e",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"Cargo.toml": "dc370d5fdde37238c3e4820046f11c3201020406a4edfa1308257c13edbdcda4",
|
||||
"Cargo.lock": "faae2edce8b573fd32fcb4bd1f898be7d700a5b38479439f5bec96df764688fd"
|
||||
},
|
||||
"comparisons": [
|
||||
{
|
||||
"start_bits": 0,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "1e684e3e6b93407fb3f37762a4de01f8706c047cf5294cf9d2a1ac173fc02075",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "1e684e3e6b93407fb3f37762a4de01f8706c047cf5294cf9d2a1ac173fc02075",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "1e684e3e6b93407fb3f37762a4de01f8706c047cf5294cf9d2a1ac173fc02075",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 8388608,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "4200cba9cf0053911e1d672fabbee94f5267d5b7aa109fbe57ddc5a4f7b70393",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "4200cba9cf0053911e1d672fabbee94f5267d5b7aa109fbe57ddc5a4f7b70393",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "4200cba9cf0053911e1d672fabbee94f5267d5b7aa109fbe57ddc5a4f7b70393",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 1056899072,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "cae10428767d3e776f5183caba1780897d2e1831913c05ae6dd8d843a6e25a76",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "cae10428767d3e776f5183caba1780897d2e1831913c05ae6dd8d843a6e25a76",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "cae10428767d3e776f5183caba1780897d2e1831913c05ae6dd8d843a6e25a76",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 1065287680,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "59024062288c0bc65906a38484eff0fb73aaba11cb8110aaebc6dde8891ed10c",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "59024062288c0bc65906a38484eff0fb73aaba11cb8110aaebc6dde8891ed10c",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "59024062288c0bc65906a38484eff0fb73aaba11cb8110aaebc6dde8891ed10c",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 1065353216,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "01849695d0e9a30ccd132270cb79ecaaf1065411d66b323a36f1b87f5d0e4596",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "01849695d0e9a30ccd132270cb79ecaaf1065411d66b323a36f1b87f5d0e4596",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "01849695d0e9a30ccd132270cb79ecaaf1065411d66b323a36f1b87f5d0e4596",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 1073741824,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "0df001f091df446399cccd24b0fa1e4114894c263d5cdc707b8c4a2ded269936",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "0df001f091df446399cccd24b0fa1e4114894c263d5cdc707b8c4a2ded269936",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "0df001f091df446399cccd24b0fa1e4114894c263d5cdc707b8c4a2ded269936",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 2139029504,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "c39faee80d047d450472ae5eb25f2811e4010b5aad1ccad80ff4d8f7638bd3d5",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "c39faee80d047d450472ae5eb25f2811e4010b5aad1ccad80ff4d8f7638bd3d5",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "c39faee80d047d450472ae5eb25f2811e4010b5aad1ccad80ff4d8f7638bd3d5",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 2139095040,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "1c60d380d4dc55a05bed3452e32f4d5c813c9beb4459ba890338c27f0b047345",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "1c60d380d4dc55a05bed3452e32f4d5c813c9beb4459ba890338c27f0b047345",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "1c60d380d4dc55a05bed3452e32f4d5c813c9beb4459ba890338c27f0b047345",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 2147418112,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 2147483648,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "b365699b17956be9409c58c88b48da5f7edf7e4783fcca72efa00b0dae84455f",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "b365699b17956be9409c58c88b48da5f7edf7e4783fcca72efa00b0dae84455f",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "b365699b17956be9409c58c88b48da5f7edf7e4783fcca72efa00b0dae84455f",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 2155872256,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 3212771328,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 3212836864,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 4286513152,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 4286578688,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start_bits": 4294901760,
|
||||
"count": 65536,
|
||||
"rust_output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "f3b37b44be6c4c25b1d85b2bce7844c67cc9f3e5a3270d4a53101d99049b966e",
|
||||
"matched_float_values": 65536
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"scope": "Compiled scalar UnaryFunction.LogSampler compared by float result bits across the recorded input bit ranges, including signed zeros, subnormals, finite values, infinities and NaNs. NaN results are canonicalized as Float.floatToIntBits. Exhaustive mode checks all 2^32 float input bit patterns against both checksum-pinned JARs on this machine's JDK. Bulk composition, range propagation, compiler rewriting and other operations belong to the separate density suite. This does not establish double-precision Math.log parity, other-platform math parity, complete terrain, gameplay or performance."
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 8338,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "d2f5b022be1ee2111c38acf6710c21b59da09506e246fb22b8c7c8eeb253a7d9",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "e321bed47d34ef1fdcdd99dad07cc537d34ed3cfbc07f10f10ec8b6848daf208",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "22701112922a2f806a1d6906f0e56bfbff309093bbbc7c140bf077d9686e854f"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-collision-context-parity/inputs.txt": "60b49e91a7a4999cfb8eb6ac3fbc6ec0a931d68cd53f9737959a2bd2b42be7a5"
|
||||
},
|
||||
"rust_output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
}
|
||||
],
|
||||
"scope": "Actual CollisionContext factories and EntityCollisionContext/Empty/PositionCollisionContext queries on controlled player and marker snapshots. Checks entity identity, captured descending and placement flags, fluid collision flags, empty-stack AIR identity, height thresholds including f32 epsilon, null factories, callback arguments/order/failures and all five fluid type pairs. Entity lifecycle, inventory mutations after capture, experimental minecart contexts, contextual block shape dispatch and live movement integration remain pending."
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 56448,
|
||||
"block_states": 32,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "d2f5b022be1ee2111c38acf6710c21b59da09506e246fb22b8c7c8eeb253a7d9",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_scaffolding_collision_parity.py": "bab75e2cad68a3193035a87497eaa372466c405293cc547e39dbd7bd4450d69d",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "e321bed47d34ef1fdcdd99dad07cc537d34ed3cfbc07f10f10ec8b6848daf208",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "22701112922a2f806a1d6906f0e56bfbff309093bbbc7c140bf077d9686e854f"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-scaffolding-collision-parity/inputs.txt": "5945054e86700237a7b6de6b362a37a98bdc8afaa67004e8aaa92da1421b552c"
|
||||
},
|
||||
"rust_output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"matched_output_lines": 524300
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"matched_output_lines": 524300
|
||||
}
|
||||
],
|
||||
"scope": "Actual CollisionContext.getCollisionShape dispatch and native scaffolding behavior for all 32 scaffolding states, nine context variants, descending flags, integer Y extremes, nonfinite positions and adjacent double values around the top/bottom float-epsilon thresholds. Full shape coordinates, extrema, box ordering and cube metadata match. A rejecting world proxy verifies selection performs no world reads. Scaffolding placement/update/falling behavior and live movement remain pending."
|
||||
}
|
||||
@@ -1,141 +0,0 @@
|
||||
{
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.356194490192345,
|
||||
"elapsed_seconds": 0.541997659,
|
||||
"error": null,
|
||||
"merged_quads": 166,
|
||||
"os": "linux",
|
||||
"presented_frames": 30,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native opaque-cube renderer and free inspection camera; no gameplay simulation",
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"executable_sha256": "4907a5678c323ab250934f3dfa32ba10e1554635f81d226ed2a88e7625737c5f",
|
||||
"resource_manifest_sha256": "eda44ebee6904eab880c15458dbd1212dc2799d320a4419fc810e2ceb0e5d9d6",
|
||||
"sources": {
|
||||
"crates/horizon-client/src/assets.rs": "f35107193fc6d08be41891181da1803abf15bd373b62dd63758213809e2c5cbf",
|
||||
"crates/horizon-client/src/camera.rs": "f9821c8a51a004dd4ad9c0952e746eb07926f6040cf8660bc26da5a0728ae572",
|
||||
"crates/horizon-client/src/main.rs": "0cc250b695ba0d1e49107f581695edea1d24cdc2fb8ffa3a46368ef2c40430a7",
|
||||
"crates/horizon-client/src/mesh.rs": "e2fa00435ec8239ba8a3c6539022bb50a10ff9c3850c6faab72f86aabea896ef",
|
||||
"crates/horizon-client/src/render.rs": "4d58443465ea25769d73701d138db6a99c4f939a288e89e1f2b1ee3d017a2737",
|
||||
"crates/horizon-client/src/world.rs": "901aa59c23ea084e926eec014589f4d511c41691a8dc1520534e039c28cfc76c",
|
||||
"crates/horizon-client/src/world.wgsl": "dd7d579d0afb8a61da849171e444fa05a3e9d15bbfe6d019ff6653e8e0774c66",
|
||||
"Cargo.toml": "4f803d21656a1420555bee6369617ddc825219a2cf05f842a209b3f8eaa583ec",
|
||||
"Cargo.lock": "b1674833e1d5e66032589eea75643bf1c1eb2f2d6503e79ff7da8efa1b6d21dc",
|
||||
"crates/horizon-client/Cargo.toml": "3047995858c9cd103ce358dfd991cb81e7d0688a149f4874cc73c36b859bbff7",
|
||||
"tools/prepare_native_client.py": "b16f62acfc6242552af14ff405e2169ebba3adab12b991fc011e78edb4ffa982",
|
||||
"tools/test_native_client.py": "adb9aa87cc28b0980d811ce47c1b09878d2d72cef2e083b278ec41183d231f1b"
|
||||
},
|
||||
"validation": {
|
||||
"rust_workspace_tests": "passed",
|
||||
"clippy_all_targets": "passed",
|
||||
"python_tooling_tests": 149,
|
||||
"mesh_tests": 2,
|
||||
"manual_visual_checks": [
|
||||
"textured scene with 81 chunks and 382 merged quads",
|
||||
"window resize from 1600x1000 to 1280x720"
|
||||
],
|
||||
"input_checks": [
|
||||
"physical W movement",
|
||||
"physical Right rotation",
|
||||
"captured relative mouse delta (150,-50) changed yaw by -0.3 and pitch by +0.1 radians",
|
||||
"Escape and Ctrl+Q"
|
||||
]
|
||||
},
|
||||
"environment": {
|
||||
"os": "Ubuntu 26.04.1 LTS",
|
||||
"kernel": "7.0.0-31-generic",
|
||||
"cpu": "Intel Core i7-7500U",
|
||||
"display": "headless Sway Wayland",
|
||||
"renderer": "Vulkan llvmpipe software rasterizer"
|
||||
},
|
||||
"limits": [
|
||||
"Controlled development scene only; no gameplay simulation or vanilla pixel-parity claim",
|
||||
"No hardware FPS or render-distance improvement demonstrated",
|
||||
"macOS and Windows runtime checks and final playable packages remain pending",
|
||||
"Private game resources and screenshots excluded from this report"
|
||||
],
|
||||
"mouse_check": {
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.2839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.6561944901923447,
|
||||
"elapsed_seconds": 8.654220098,
|
||||
"error": null,
|
||||
"merged_quads": 166,
|
||||
"os": "linux",
|
||||
"presented_frames": 532,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native opaque-cube renderer and free inspection camera; no gameplay simulation",
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
]
|
||||
},
|
||||
"physical_keyboard_check": {
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
18.943610750255,
|
||||
18.0,
|
||||
18.943610750255
|
||||
],
|
||||
"camera_yaw": -2.6478875051923443,
|
||||
"elapsed_seconds": 17.488515374,
|
||||
"error": null,
|
||||
"merged_quads": 166,
|
||||
"os": "linux",
|
||||
"presented_frames": 1080,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native opaque-cube renderer and free inspection camera; no gameplay simulation",
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"source_note": "Same camera/input behavior; before subsequent diagnostic formatting and equivalent let-chain cleanup"
|
||||
},
|
||||
"private_capture_sha256": {
|
||||
"first-launch.png": "7e53fa26d3d55f943db41828e1c8dd5b65279f9a130854fff288c75a394ee5aa",
|
||||
"moved-resized.png": "be5a0473ab505740d18ba8eecf1512c15ba93d53d046f49b8dfa96357b25bf22",
|
||||
"mouse-look.png": "7103678309f06938de40ac294f2f9ca1f56b253bc463e792b121ba607cd7b0a3"
|
||||
}
|
||||
}
|
||||
@@ -1,800 +0,0 @@
|
||||
{
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"animated_sprites": 1,
|
||||
"animation_uploads": 1,
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.356194490192345,
|
||||
"collision_camera": false,
|
||||
"culled_model_faces": 59636,
|
||||
"elapsed_seconds": 0.547544857,
|
||||
"error": null,
|
||||
"fall_damage_requests": 0,
|
||||
"last_requested_fall_damage": null,
|
||||
"merged_quads": 3169,
|
||||
"mesh_revision": 0,
|
||||
"model_blocks": 10919,
|
||||
"model_gallery": [
|
||||
{
|
||||
"block": "minecraft:oak_stairs",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_stairs_inner",
|
||||
"rotations": [
|
||||
2,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "north",
|
||||
"half": "top",
|
||||
"shape": "inner_left",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 5466
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone_slab",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_slab_top",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"type": "top",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 15250
|
||||
},
|
||||
{
|
||||
"block": "minecraft:anvil",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/anvil",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east"
|
||||
},
|
||||
"state_id": 12965
|
||||
},
|
||||
{
|
||||
"block": "minecraft:torch",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/torch",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 4926
|
||||
},
|
||||
{
|
||||
"block": "minecraft:lantern",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/lantern",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"hanging": "false",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 24197
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_post",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "true",
|
||||
"north": "true",
|
||||
"south": "false",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 8642
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence_gate",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_gate_open",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"in_wall": "false",
|
||||
"open": "true",
|
||||
"powered": "false"
|
||||
},
|
||||
"state_id": 10401
|
||||
},
|
||||
{
|
||||
"block": "minecraft:iron_bars",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_post_ends",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side_alt",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "false",
|
||||
"north": "true",
|
||||
"south": "true",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 9711
|
||||
},
|
||||
{
|
||||
"block": "minecraft:cobweb",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/cobweb",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 2362
|
||||
},
|
||||
{
|
||||
"block": "minecraft:grindstone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/grindstone",
|
||||
"rotations": [
|
||||
1,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"face": "wall",
|
||||
"facing": "west"
|
||||
},
|
||||
"state_id": 24135
|
||||
},
|
||||
{
|
||||
"block": "minecraft:ladder",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/ladder",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 7312
|
||||
},
|
||||
{
|
||||
"block": "minecraft:amethyst_cluster",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/amethyst_cluster",
|
||||
"rotations": [
|
||||
1,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 26764
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_mirrored",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
}
|
||||
],
|
||||
"model_quads": 179,
|
||||
"movement_ticks": 0,
|
||||
"os": "linux",
|
||||
"player_absorption": null,
|
||||
"player_dead": null,
|
||||
"player_exhaustion": null,
|
||||
"player_fall_distance": null,
|
||||
"player_food": null,
|
||||
"player_food_timer": null,
|
||||
"player_health": null,
|
||||
"player_hurt_cooldown": null,
|
||||
"player_on_ground": null,
|
||||
"player_position": null,
|
||||
"player_saturation": null,
|
||||
"player_velocity": null,
|
||||
"presented_frames": 30,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native resident-scene renderer with inspection camera and optional fixed-rate dry walking test; full gameplay remains unfinished",
|
||||
"sprite_layers": 18,
|
||||
"visible_model_faces": 5991,
|
||||
"walking": false,
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"world_revision": 0,
|
||||
"native_scene_culling": {
|
||||
"blocks": 10919,
|
||||
"culled_faces": 59636,
|
||||
"visible_faces": 5991
|
||||
},
|
||||
"native_selection": {
|
||||
"matched_placements": 16,
|
||||
"selected_parts": 20,
|
||||
"client_jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "a2ff1c890d6f3a5292c3a9402f02ca5404a993dc117853b25cbe64ac92b76d30",
|
||||
"scope": "Actual native registry states, blockstate dispatch, tagged root baking and legacy collection using state.getSeed(position). All 16 featured placements match model names/transforms. An independently constructed native scene also matches total occupied blocks and visible/culled model faces using native parent resolution, rotated culling directions and Block.shouldRenderFace. No shader/pixel parity claim."
|
||||
},
|
||||
"resource_files": {
|
||||
"files": 5590,
|
||||
"sha256": "62f859d4d21b82158ab73e26cfa4973d58ab5926ab63d71c70c7a4d173502b7b"
|
||||
},
|
||||
"executable_sha256": "62fc8ff8bc750d2afeede7aaf830484de869655d7334c2a6405c9194e9a79cf9",
|
||||
"resource_manifest_sha256": "92a51de578be0e7c37d21e94caa3f22503f7d88b73827a5fce109b1b889e5d18",
|
||||
"sources": {
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"tools/test_native_client.py": "6c615fed67fd7bcf09b3184216e08a82012049880a0d4da7c89f86553090cbda",
|
||||
"crates/horizon-client/Cargo.toml": "d56524457d761c2613c0699b20e21ad6977d93e009d59ef150bbd9fc20d7a025",
|
||||
"crates/horizon-assets/Cargo.toml": "2f2cffacec0b4e22dd7cb032d594289bc51c94ae6cc4e985fee3e310f441d751",
|
||||
"crates/horizon-client/src/assets.rs": "e595afa610e0425d0b3ad694218794bf9e680e46ae80f3925c278ef1a823c914",
|
||||
"crates/horizon-client/src/camera.rs": "d386a56ca8fb3b37ba2b2ed9d09342f61b409a575bb21590e934120b4ccebfa6",
|
||||
"crates/horizon-client/src/clock.rs": "4851ada3e8e65d935eda8c0b57d3b51233b34f74aab4f040fd53db0e0d40b8df",
|
||||
"crates/horizon-client/src/collisions.rs": "112286b07c4cd11b36da8b6799e0e069e69dfddf9a8a3f9ce36dcb282c791d67",
|
||||
"crates/horizon-client/src/health.rs": "b5e2d3cde4bd58d906e6f6d47cd756ed23aa6706c71b10c3aedde30c11806403",
|
||||
"crates/horizon-client/src/hunger.rs": "01d8a35f570f2a0991ac17a078f2066a5a83037a728158585765723d208b4611",
|
||||
"crates/horizon-client/src/input.rs": "55b259ca6425c502270e7abc4d3ae1b3838633e2bd77d3817c6e00d9143a2beb",
|
||||
"crates/horizon-client/src/landing.rs": "b9d0ecc5ec60a09d75ab9fe778e0a2e5bbb36fd8364a7ce996405f3dc9cb3b9f",
|
||||
"crates/horizon-client/src/lib.rs": "bc1d0a7e42c11a9090abfebc4ed1f595415dd8b72a6a04b63c765b0deba29f6f",
|
||||
"crates/horizon-client/src/main.rs": "aeb6b5220f8b89a1c9e85bf23fa2bbbafbc876108e59a222d383ad6e6fa238a6",
|
||||
"crates/horizon-client/src/mesh.rs": "4ac8d85b30f599b37a98b92adcc016b16434816b93c401bd39b8215f591f9330",
|
||||
"crates/horizon-client/src/models/catalog.rs": "620103719167fc9ab76e730d68eeacb50014e95b7ad209ae7adf2cbbe69f70f7",
|
||||
"crates/horizon-client/src/models/cube.rs": "1067229f9dd9b276950bf7ec0c5f67061ce3d40a21932dca8034b9748e7439a4",
|
||||
"crates/horizon-client/src/models.rs": "98dd3b969947c2b297862a934e6235067ddc1fc8cda5adcc6276d19014d4b048",
|
||||
"crates/horizon-client/src/motion.rs": "673cc4bf6c4bc5523c104981e7c1cd640081a1b6ddca1e0ebe02181f04830347",
|
||||
"crates/horizon-client/src/render.rs": "75cb40c257cf61e51009d292a06cd96532f59320b12ed7c3a509bbdbe1accdd4",
|
||||
"crates/horizon-client/src/sprites.rs": "292f844a31f6e8884008df9630e2b8862db1acfbc4640cc07d526e25f21f0bc5",
|
||||
"crates/horizon-client/src/world.rs": "0333ecf3e18ccc63117295feb2cf77661462ba13feb293eeec667c12811423b5",
|
||||
"crates/horizon-client/src/world.wgsl": "972a58ccb34e9965515adbb30c47a93fceca5b742390db6d9f69cba1ec31f559",
|
||||
"crates/horizon-assets/src/animation.rs": "ebbf7952146a0e66b41396174492f5702627170b03a57e6cd5a45c97a08c975e",
|
||||
"crates/horizon-assets/src/bake/transform.rs": "a95e658fef85b21bcb2f9f7512f98f98d57022d62c1199885b7133beae35a09d",
|
||||
"crates/horizon-assets/src/bake.rs": "f55dda6b6cee5ac6e65a8ee4837fdd2c6674437d59e59b4c45718f6324d4a4d5",
|
||||
"crates/horizon-assets/src/blockstate/bind.rs": "6278962e55c9786bba8184bdf2939af9c6e3b9002b08c3022129964b49a60009",
|
||||
"crates/horizon-assets/src/blockstate/choice.rs": "5a66c8b9833e2f19dd8b0773f3593d97ff5941d3c5b773896b98049efa1395ba",
|
||||
"crates/horizon-assets/src/blockstate.rs": "a4299dfd7adaeb4173982ffaa8e9c9eda2925739ae579a714193c99da2e7ce56",
|
||||
"crates/horizon-assets/src/json.rs": "99fe8af4fbf5d4eed408a92e829ac1a39597a0d92471a6bff73771fad9c830a8",
|
||||
"crates/horizon-assets/src/lib.rs": "e39f21c59a2c3e1c53d977b29bd5e0638e5fc41d86ff0fcc1882a6d90fd961e4",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaGallerySelectionOracle.java": "dc5433f1ce1de629b30cb70f031a43a691fc1df1fb218ce23de89769c164d562",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
|
||||
"tools/test_model_baking_parity.py": "392ffec44918fb91740ca4a1316d684480d39f14bd34d46175f7f44946d15bd7",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/prepare_native_client.py": "159c12846058954a35ce86d415dc12fc89a6f11d46d21d1616ee686b7af4eee4",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"crates/horizon-world/src/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "577c16c021352b706d123f0f1c734375fc4a5a67b508caccbc38c1e1f693f6f4",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "8155b315453c569db2fbe46228886c5881d1fd55eb095c5849e69bdb500ba2bd",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "0a94885c4b7a0d294ba7f4cee18b96ee59649b50112988250b53cc224059a979",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "29af22dec321fe01776cee5334f050c5bc3e27a688f99c8c3da4c0ad8bc8254e",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f"
|
||||
}
|
||||
}
|
||||
@@ -1,790 +0,0 @@
|
||||
{
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"animated_sprites": 1,
|
||||
"animation_uploads": 1,
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.356194490192345,
|
||||
"collision_camera": false,
|
||||
"culled_model_faces": 59636,
|
||||
"elapsed_seconds": 0.547517663,
|
||||
"error": null,
|
||||
"fall_damage_requests": 0,
|
||||
"last_requested_fall_damage": null,
|
||||
"merged_quads": 3169,
|
||||
"mesh_revision": 0,
|
||||
"model_blocks": 10919,
|
||||
"model_gallery": [
|
||||
{
|
||||
"block": "minecraft:oak_stairs",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_stairs_inner",
|
||||
"rotations": [
|
||||
2,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "north",
|
||||
"half": "top",
|
||||
"shape": "inner_left",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 5466
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone_slab",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_slab_top",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"type": "top",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 15250
|
||||
},
|
||||
{
|
||||
"block": "minecraft:anvil",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/anvil",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east"
|
||||
},
|
||||
"state_id": 12965
|
||||
},
|
||||
{
|
||||
"block": "minecraft:torch",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/torch",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 4926
|
||||
},
|
||||
{
|
||||
"block": "minecraft:lantern",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/lantern",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"hanging": "false",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 24197
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_post",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "true",
|
||||
"north": "true",
|
||||
"south": "false",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 8642
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence_gate",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_gate_open",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"in_wall": "false",
|
||||
"open": "true",
|
||||
"powered": "false"
|
||||
},
|
||||
"state_id": 10401
|
||||
},
|
||||
{
|
||||
"block": "minecraft:iron_bars",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_post_ends",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side_alt",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "false",
|
||||
"north": "true",
|
||||
"south": "true",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 9711
|
||||
},
|
||||
{
|
||||
"block": "minecraft:cobweb",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/cobweb",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 2362
|
||||
},
|
||||
{
|
||||
"block": "minecraft:grindstone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/grindstone",
|
||||
"rotations": [
|
||||
1,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"face": "wall",
|
||||
"facing": "west"
|
||||
},
|
||||
"state_id": 24135
|
||||
},
|
||||
{
|
||||
"block": "minecraft:ladder",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/ladder",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 7312
|
||||
},
|
||||
{
|
||||
"block": "minecraft:amethyst_cluster",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/amethyst_cluster",
|
||||
"rotations": [
|
||||
1,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 26764
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_mirrored",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
}
|
||||
],
|
||||
"model_quads": 179,
|
||||
"movement_ticks": 0,
|
||||
"os": "linux",
|
||||
"player_fall_distance": null,
|
||||
"player_on_ground": null,
|
||||
"player_position": null,
|
||||
"player_velocity": null,
|
||||
"presented_frames": 30,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native resident-scene renderer with inspection camera and optional fixed-rate dry walking test; full gameplay remains unfinished",
|
||||
"sprite_layers": 18,
|
||||
"visible_model_faces": 5991,
|
||||
"walking": false,
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"world_revision": 0,
|
||||
"native_scene_culling": {
|
||||
"blocks": 10919,
|
||||
"culled_faces": 59636,
|
||||
"visible_faces": 5991
|
||||
},
|
||||
"native_selection": {
|
||||
"matched_placements": 16,
|
||||
"selected_parts": 20,
|
||||
"client_jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "a2ff1c890d6f3a5292c3a9402f02ca5404a993dc117853b25cbe64ac92b76d30",
|
||||
"scope": "Actual native registry states, blockstate dispatch, tagged root baking and legacy collection using state.getSeed(position). All 16 featured placements match model names/transforms. An independently constructed native scene also matches total occupied blocks and visible/culled model faces using native parent resolution, rotated culling directions and Block.shouldRenderFace. No shader/pixel parity claim."
|
||||
},
|
||||
"resource_files": {
|
||||
"files": 5586,
|
||||
"sha256": "df3e6624ad08800f224dbe4c90fd3753ba84e7643f93475701957108a73acb25"
|
||||
},
|
||||
"executable_sha256": "fcfd655b756ed003cd5b97fe9ca5afba8b965813b2d7cb30e7639168f8d17e22",
|
||||
"resource_manifest_sha256": "91491cf250a0032f6a7fc8e4a10807f7384310d927babe178ffc75ded8ef25b0",
|
||||
"sources": {
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"tools/test_native_client.py": "9310a571c3a8908c6c4804a8b14935882382da0f4755ffc4d1087d379824bb32",
|
||||
"crates/horizon-client/Cargo.toml": "d56524457d761c2613c0699b20e21ad6977d93e009d59ef150bbd9fc20d7a025",
|
||||
"crates/horizon-assets/Cargo.toml": "2f2cffacec0b4e22dd7cb032d594289bc51c94ae6cc4e985fee3e310f441d751",
|
||||
"crates/horizon-client/src/assets.rs": "e595afa610e0425d0b3ad694218794bf9e680e46ae80f3925c278ef1a823c914",
|
||||
"crates/horizon-client/src/camera.rs": "d386a56ca8fb3b37ba2b2ed9d09342f61b409a575bb21590e934120b4ccebfa6",
|
||||
"crates/horizon-client/src/clock.rs": "4851ada3e8e65d935eda8c0b57d3b51233b34f74aab4f040fd53db0e0d40b8df",
|
||||
"crates/horizon-client/src/collisions.rs": "112286b07c4cd11b36da8b6799e0e069e69dfddf9a8a3f9ce36dcb282c791d67",
|
||||
"crates/horizon-client/src/input.rs": "55b259ca6425c502270e7abc4d3ae1b3838633e2bd77d3817c6e00d9143a2beb",
|
||||
"crates/horizon-client/src/landing.rs": "4192ce43717696b2c893b69f7f156b3084cd5a92dd275f0c5be1ee7c6228918b",
|
||||
"crates/horizon-client/src/lib.rs": "6eb8caa81741cabc56651603f9be8d15a8d219be5a5ae4dc2045c557fc24bb79",
|
||||
"crates/horizon-client/src/main.rs": "aa602d14ab9512de90165c9aeee40dd04d5cd602d8fc2a9d2d7139f12a7db1ec",
|
||||
"crates/horizon-client/src/mesh.rs": "4ac8d85b30f599b37a98b92adcc016b16434816b93c401bd39b8215f591f9330",
|
||||
"crates/horizon-client/src/models/catalog.rs": "620103719167fc9ab76e730d68eeacb50014e95b7ad209ae7adf2cbbe69f70f7",
|
||||
"crates/horizon-client/src/models/cube.rs": "1067229f9dd9b276950bf7ec0c5f67061ce3d40a21932dca8034b9748e7439a4",
|
||||
"crates/horizon-client/src/models.rs": "98dd3b969947c2b297862a934e6235067ddc1fc8cda5adcc6276d19014d4b048",
|
||||
"crates/horizon-client/src/motion.rs": "0b2ecde5118b60a158e18aa5cf7746ef88566a0ad0fc3c97594b8d5ee00b1cdb",
|
||||
"crates/horizon-client/src/render.rs": "75cb40c257cf61e51009d292a06cd96532f59320b12ed7c3a509bbdbe1accdd4",
|
||||
"crates/horizon-client/src/sprites.rs": "292f844a31f6e8884008df9630e2b8862db1acfbc4640cc07d526e25f21f0bc5",
|
||||
"crates/horizon-client/src/world.rs": "66c921c4a0c4e5bf97f2594ed243f6769d0dcebe9fe227177df928df22d6d03e",
|
||||
"crates/horizon-client/src/world.wgsl": "972a58ccb34e9965515adbb30c47a93fceca5b742390db6d9f69cba1ec31f559",
|
||||
"crates/horizon-assets/src/animation.rs": "ebbf7952146a0e66b41396174492f5702627170b03a57e6cd5a45c97a08c975e",
|
||||
"crates/horizon-assets/src/bake/transform.rs": "a95e658fef85b21bcb2f9f7512f98f98d57022d62c1199885b7133beae35a09d",
|
||||
"crates/horizon-assets/src/bake.rs": "f55dda6b6cee5ac6e65a8ee4837fdd2c6674437d59e59b4c45718f6324d4a4d5",
|
||||
"crates/horizon-assets/src/blockstate/bind.rs": "6278962e55c9786bba8184bdf2939af9c6e3b9002b08c3022129964b49a60009",
|
||||
"crates/horizon-assets/src/blockstate/choice.rs": "5a66c8b9833e2f19dd8b0773f3593d97ff5941d3c5b773896b98049efa1395ba",
|
||||
"crates/horizon-assets/src/blockstate.rs": "a4299dfd7adaeb4173982ffaa8e9c9eda2925739ae579a714193c99da2e7ce56",
|
||||
"crates/horizon-assets/src/json.rs": "99fe8af4fbf5d4eed408a92e829ac1a39597a0d92471a6bff73771fad9c830a8",
|
||||
"crates/horizon-assets/src/lib.rs": "e39f21c59a2c3e1c53d977b29bd5e0638e5fc41d86ff0fcc1882a6d90fd961e4",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaGallerySelectionOracle.java": "dc5433f1ce1de629b30cb70f031a43a691fc1df1fb218ce23de89769c164d562",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
|
||||
"tools/test_model_baking_parity.py": "392ffec44918fb91740ca4a1316d684480d39f14bd34d46175f7f44946d15bd7",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/prepare_native_client.py": "3a02b5f384235eb2d7002396cbddffb3bf3840534c205c85aefac090562b76c4",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"crates/horizon-world/src/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "577c16c021352b706d123f0f1c734375fc4a5a67b508caccbc38c1e1f693f6f4",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "79ecb6b4d7a044dc98e5552c53a5ac2724545b1c1cec4d797eb52576728e3480",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "a9743971581af86d926eeba42004d932caf83382c470dd98bf613cb9c417db58",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "828a4649fec3e9bda2dfe20aced8c95922c697321de2be4127bd4e5712ecbb7c",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f"
|
||||
}
|
||||
}
|
||||
@@ -1,801 +0,0 @@
|
||||
{
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"animated_sprites": 1,
|
||||
"animation_uploads": 1,
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.356194490192345,
|
||||
"collision_camera": false,
|
||||
"culled_model_faces": 59636,
|
||||
"elapsed_seconds": 0.556021335,
|
||||
"error": null,
|
||||
"fall_damage_requests": 0,
|
||||
"last_requested_fall_damage": null,
|
||||
"merged_quads": 3169,
|
||||
"mesh_revision": 0,
|
||||
"model_blocks": 10919,
|
||||
"model_gallery": [
|
||||
{
|
||||
"block": "minecraft:oak_stairs",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_stairs_inner",
|
||||
"rotations": [
|
||||
2,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "north",
|
||||
"half": "top",
|
||||
"shape": "inner_left",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 5466
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone_slab",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_slab_top",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"type": "top",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 15250
|
||||
},
|
||||
{
|
||||
"block": "minecraft:anvil",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/anvil",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east"
|
||||
},
|
||||
"state_id": 12965
|
||||
},
|
||||
{
|
||||
"block": "minecraft:torch",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/torch",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 4926
|
||||
},
|
||||
{
|
||||
"block": "minecraft:lantern",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/lantern",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"hanging": "false",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 24197
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_post",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "true",
|
||||
"north": "true",
|
||||
"south": "false",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 8642
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence_gate",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_gate_open",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"in_wall": "false",
|
||||
"open": "true",
|
||||
"powered": "false"
|
||||
},
|
||||
"state_id": 10401
|
||||
},
|
||||
{
|
||||
"block": "minecraft:iron_bars",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_post_ends",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side_alt",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "false",
|
||||
"north": "true",
|
||||
"south": "true",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 9711
|
||||
},
|
||||
{
|
||||
"block": "minecraft:cobweb",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/cobweb",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 2362
|
||||
},
|
||||
{
|
||||
"block": "minecraft:grindstone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/grindstone",
|
||||
"rotations": [
|
||||
1,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"face": "wall",
|
||||
"facing": "west"
|
||||
},
|
||||
"state_id": 24135
|
||||
},
|
||||
{
|
||||
"block": "minecraft:ladder",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/ladder",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 7312
|
||||
},
|
||||
{
|
||||
"block": "minecraft:amethyst_cluster",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/amethyst_cluster",
|
||||
"rotations": [
|
||||
1,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 26764
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_mirrored",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
}
|
||||
],
|
||||
"model_quads": 179,
|
||||
"movement_ticks": 0,
|
||||
"os": "linux",
|
||||
"player_absorption": null,
|
||||
"player_dead": null,
|
||||
"player_exhaustion": null,
|
||||
"player_fall_distance": null,
|
||||
"player_food": null,
|
||||
"player_food_timer": null,
|
||||
"player_health": null,
|
||||
"player_hurt_cooldown": null,
|
||||
"player_on_ground": null,
|
||||
"player_position": null,
|
||||
"player_saturation": null,
|
||||
"player_velocity": null,
|
||||
"presented_frames": 30,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native resident-scene renderer with inspection camera and optional fixed-rate dry walking test; full gameplay remains unfinished",
|
||||
"sprite_layers": 18,
|
||||
"visible_model_faces": 5991,
|
||||
"walking": false,
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"world_revision": 0,
|
||||
"native_scene_culling": {
|
||||
"blocks": 10919,
|
||||
"culled_faces": 59636,
|
||||
"visible_faces": 5991
|
||||
},
|
||||
"native_selection": {
|
||||
"matched_placements": 16,
|
||||
"selected_parts": 20,
|
||||
"client_jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "a2ff1c890d6f3a5292c3a9402f02ca5404a993dc117853b25cbe64ac92b76d30",
|
||||
"scope": "Actual native registry states, blockstate dispatch, tagged root baking and legacy collection using state.getSeed(position). All 16 featured placements match model names/transforms. An independently constructed native scene also matches total occupied blocks and visible/culled model faces using native parent resolution, rotated culling directions and Block.shouldRenderFace. No shader/pixel parity claim."
|
||||
},
|
||||
"resource_files": {
|
||||
"files": 5590,
|
||||
"sha256": "62f859d4d21b82158ab73e26cfa4973d58ab5926ab63d71c70c7a4d173502b7b"
|
||||
},
|
||||
"executable_sha256": "ac49c3978800a25550c082b05c1a56fc73a8d806ee1bdb0e4825a02051bf802b",
|
||||
"resource_manifest_sha256": "92a51de578be0e7c37d21e94caa3f22503f7d88b73827a5fce109b1b889e5d18",
|
||||
"sources": {
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"tools/test_native_client.py": "6c615fed67fd7bcf09b3184216e08a82012049880a0d4da7c89f86553090cbda",
|
||||
"crates/horizon-client/Cargo.toml": "d56524457d761c2613c0699b20e21ad6977d93e009d59ef150bbd9fc20d7a025",
|
||||
"crates/horizon-assets/Cargo.toml": "2f2cffacec0b4e22dd7cb032d594289bc51c94ae6cc4e985fee3e310f441d751",
|
||||
"crates/horizon-client/src/assets.rs": "e595afa610e0425d0b3ad694218794bf9e680e46ae80f3925c278ef1a823c914",
|
||||
"crates/horizon-client/src/camera.rs": "d386a56ca8fb3b37ba2b2ed9d09342f61b409a575bb21590e934120b4ccebfa6",
|
||||
"crates/horizon-client/src/clock.rs": "4851ada3e8e65d935eda8c0b57d3b51233b34f74aab4f040fd53db0e0d40b8df",
|
||||
"crates/horizon-client/src/collisions.rs": "112286b07c4cd11b36da8b6799e0e069e69dfddf9a8a3f9ce36dcb282c791d67",
|
||||
"crates/horizon-client/src/health.rs": "b5e2d3cde4bd58d906e6f6d47cd756ed23aa6706c71b10c3aedde30c11806403",
|
||||
"crates/horizon-client/src/hunger.rs": "01d8a35f570f2a0991ac17a078f2066a5a83037a728158585765723d208b4611",
|
||||
"crates/horizon-client/src/input.rs": "55b259ca6425c502270e7abc4d3ae1b3838633e2bd77d3817c6e00d9143a2beb",
|
||||
"crates/horizon-client/src/landing.rs": "b9d0ecc5ec60a09d75ab9fe778e0a2e5bbb36fd8364a7ce996405f3dc9cb3b9f",
|
||||
"crates/horizon-client/src/lib.rs": "bc1d0a7e42c11a9090abfebc4ed1f595415dd8b72a6a04b63c765b0deba29f6f",
|
||||
"crates/horizon-client/src/main.rs": "aeb6b5220f8b89a1c9e85bf23fa2bbbafbc876108e59a222d383ad6e6fa238a6",
|
||||
"crates/horizon-client/src/mesh.rs": "4ac8d85b30f599b37a98b92adcc016b16434816b93c401bd39b8215f591f9330",
|
||||
"crates/horizon-client/src/models/catalog.rs": "620103719167fc9ab76e730d68eeacb50014e95b7ad209ae7adf2cbbe69f70f7",
|
||||
"crates/horizon-client/src/models/cube.rs": "1067229f9dd9b276950bf7ec0c5f67061ce3d40a21932dca8034b9748e7439a4",
|
||||
"crates/horizon-client/src/models.rs": "98dd3b969947c2b297862a934e6235067ddc1fc8cda5adcc6276d19014d4b048",
|
||||
"crates/horizon-client/src/motion.rs": "833d7e14ee37f82bef05094c1f0fa681b5ead3b3bcf4e915fbd5bc94e46dd7ad",
|
||||
"crates/horizon-client/src/render.rs": "75cb40c257cf61e51009d292a06cd96532f59320b12ed7c3a509bbdbe1accdd4",
|
||||
"crates/horizon-client/src/sprites.rs": "292f844a31f6e8884008df9630e2b8862db1acfbc4640cc07d526e25f21f0bc5",
|
||||
"crates/horizon-client/src/world.rs": "0333ecf3e18ccc63117295feb2cf77661462ba13feb293eeec667c12811423b5",
|
||||
"crates/horizon-client/src/world.wgsl": "972a58ccb34e9965515adbb30c47a93fceca5b742390db6d9f69cba1ec31f559",
|
||||
"crates/horizon-assets/src/animation.rs": "ebbf7952146a0e66b41396174492f5702627170b03a57e6cd5a45c97a08c975e",
|
||||
"crates/horizon-assets/src/bake/transform.rs": "a95e658fef85b21bcb2f9f7512f98f98d57022d62c1199885b7133beae35a09d",
|
||||
"crates/horizon-assets/src/bake.rs": "f55dda6b6cee5ac6e65a8ee4837fdd2c6674437d59e59b4c45718f6324d4a4d5",
|
||||
"crates/horizon-assets/src/blockstate/bind.rs": "6278962e55c9786bba8184bdf2939af9c6e3b9002b08c3022129964b49a60009",
|
||||
"crates/horizon-assets/src/blockstate/choice.rs": "5a66c8b9833e2f19dd8b0773f3593d97ff5941d3c5b773896b98049efa1395ba",
|
||||
"crates/horizon-assets/src/blockstate.rs": "a4299dfd7adaeb4173982ffaa8e9c9eda2925739ae579a714193c99da2e7ce56",
|
||||
"crates/horizon-assets/src/json.rs": "99fe8af4fbf5d4eed408a92e829ac1a39597a0d92471a6bff73771fad9c830a8",
|
||||
"crates/horizon-assets/src/lib.rs": "e39f21c59a2c3e1c53d977b29bd5e0638e5fc41d86ff0fcc1882a6d90fd961e4",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaGallerySelectionOracle.java": "dc5433f1ce1de629b30cb70f031a43a691fc1df1fb218ce23de89769c164d562",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
|
||||
"tools/test_model_baking_parity.py": "392ffec44918fb91740ca4a1316d684480d39f14bd34d46175f7f44946d15bd7",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/prepare_native_client.py": "159c12846058954a35ce86d415dc12fc89a6f11d46d21d1616ee686b7af4eee4",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"crates/horizon-world/src/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "e25b3543c07f31c2a9d23d811792de9a33290263c7c7445549a0682f6935d8a5",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_statistics.rs": "fe28061e29c41f8f399d29cce8c468a63854613702b5aa525c0f0fd98cb87f9a",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "8155b315453c569db2fbe46228886c5881d1fd55eb095c5849e69bdb500ba2bd",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "0a94885c4b7a0d294ba7f4cee18b96ee59649b50112988250b53cc224059a979",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "29af22dec321fe01776cee5334f050c5bc3e27a688f99c8c3da4c0ad8bc8254e",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f"
|
||||
}
|
||||
}
|
||||
@@ -1,807 +0,0 @@
|
||||
{
|
||||
"adapter": {
|
||||
"backend": "Vulkan",
|
||||
"device": 0,
|
||||
"device_type": "Cpu",
|
||||
"name": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"vendor": 65541
|
||||
},
|
||||
"animated_sprites": 1,
|
||||
"animation_uploads": 1,
|
||||
"arch": "x86_64",
|
||||
"camera_pitch": -0.3839724354387525,
|
||||
"camera_position": [
|
||||
25.0,
|
||||
18.0,
|
||||
25.0
|
||||
],
|
||||
"camera_yaw": -2.356194490192345,
|
||||
"collision_camera": false,
|
||||
"culled_model_faces": 59636,
|
||||
"elapsed_seconds": 0.545908777,
|
||||
"error": null,
|
||||
"fall_damage_requests": 0,
|
||||
"last_requested_fall_damage": null,
|
||||
"merged_quads": 3169,
|
||||
"mesh_revision": 0,
|
||||
"model_blocks": 10919,
|
||||
"model_gallery": [
|
||||
{
|
||||
"block": "minecraft:oak_stairs",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_stairs_inner",
|
||||
"rotations": [
|
||||
2,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "north",
|
||||
"half": "top",
|
||||
"shape": "inner_left",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 5466
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone_slab",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_slab_top",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"type": "top",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 15250
|
||||
},
|
||||
{
|
||||
"block": "minecraft:anvil",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/anvil",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east"
|
||||
},
|
||||
"state_id": 12965
|
||||
},
|
||||
{
|
||||
"block": "minecraft:torch",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/torch",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
14
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 4926
|
||||
},
|
||||
{
|
||||
"block": "minecraft:lantern",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/lantern",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"hanging": "false",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 24197
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_post",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_side",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "true",
|
||||
"north": "true",
|
||||
"south": "false",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 8642
|
||||
},
|
||||
{
|
||||
"block": "minecraft:oak_fence_gate",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/oak_fence_gate_open",
|
||||
"rotations": [
|
||||
0,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": true
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"in_wall": "false",
|
||||
"open": "true",
|
||||
"powered": "false"
|
||||
},
|
||||
"state_id": 10401
|
||||
},
|
||||
{
|
||||
"block": "minecraft:iron_bars",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_post_ends",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
},
|
||||
{
|
||||
"model": "minecraft:block/iron_bars_side_alt",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
18
|
||||
],
|
||||
"properties": {
|
||||
"east": "false",
|
||||
"north": "true",
|
||||
"south": "true",
|
||||
"waterlogged": "false",
|
||||
"west": "false"
|
||||
},
|
||||
"state_id": 9711
|
||||
},
|
||||
{
|
||||
"block": "minecraft:cobweb",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/cobweb",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 2362
|
||||
},
|
||||
{
|
||||
"block": "minecraft:grindstone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/grindstone",
|
||||
"rotations": [
|
||||
1,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"face": "wall",
|
||||
"facing": "west"
|
||||
},
|
||||
"state_id": 24135
|
||||
},
|
||||
{
|
||||
"block": "minecraft:ladder",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/ladder",
|
||||
"rotations": [
|
||||
0,
|
||||
3,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "west",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 7312
|
||||
},
|
||||
{
|
||||
"block": "minecraft:amethyst_cluster",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/amethyst_cluster",
|
||||
"rotations": [
|
||||
1,
|
||||
1,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
22
|
||||
],
|
||||
"properties": {
|
||||
"facing": "east",
|
||||
"waterlogged": "false"
|
||||
},
|
||||
"state_id": 26764
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-7,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone_mirrored",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
-3,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
1,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
},
|
||||
{
|
||||
"block": "minecraft:stone",
|
||||
"models": [
|
||||
{
|
||||
"model": "minecraft:block/stone",
|
||||
"rotations": [
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
"uv_lock": false
|
||||
}
|
||||
],
|
||||
"position": [
|
||||
5,
|
||||
4,
|
||||
26
|
||||
],
|
||||
"properties": {},
|
||||
"state_id": 1
|
||||
}
|
||||
],
|
||||
"model_quads": 179,
|
||||
"movement_ticks": 0,
|
||||
"os": "linux",
|
||||
"player_absorption": null,
|
||||
"player_dead": null,
|
||||
"player_exhaustion": null,
|
||||
"player_fall_distance": null,
|
||||
"player_food": null,
|
||||
"player_food_timer": null,
|
||||
"player_health": null,
|
||||
"player_hurt_cooldown": null,
|
||||
"player_on_ground": null,
|
||||
"player_position": null,
|
||||
"player_saturation": null,
|
||||
"player_sprint_trigger": null,
|
||||
"player_sprinting": null,
|
||||
"player_velocity": null,
|
||||
"presented_frames": 30,
|
||||
"project": "Horizon",
|
||||
"resident_chunks": 9,
|
||||
"schema": 1,
|
||||
"scope": "Native resident-scene renderer with inspection camera and optional fixed-rate dry walking test; full gameplay remains unfinished",
|
||||
"sprint_distance_cm": 0,
|
||||
"sprint_ticks": 0,
|
||||
"sprite_layers": 18,
|
||||
"visible_model_faces": 5991,
|
||||
"walk_distance_cm": 0,
|
||||
"walking": false,
|
||||
"window_size": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"world_revision": 0,
|
||||
"native_scene_culling": {
|
||||
"blocks": 10919,
|
||||
"culled_faces": 59636,
|
||||
"visible_faces": 5991
|
||||
},
|
||||
"native_selection": {
|
||||
"matched_placements": 16,
|
||||
"selected_parts": 20,
|
||||
"client_jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "a2ff1c890d6f3a5292c3a9402f02ca5404a993dc117853b25cbe64ac92b76d30",
|
||||
"scope": "Actual native registry states, blockstate dispatch, tagged root baking and legacy collection using state.getSeed(position). All 16 featured placements match model names/transforms. An independently constructed native scene also matches total occupied blocks and visible/culled model faces using native parent resolution, rotated culling directions and Block.shouldRenderFace. No shader/pixel parity claim."
|
||||
},
|
||||
"resource_files": {
|
||||
"files": 5590,
|
||||
"sha256": "62f859d4d21b82158ab73e26cfa4973d58ab5926ab63d71c70c7a4d173502b7b"
|
||||
},
|
||||
"executable_sha256": "632eb61d13b3274d5c991f2f2daffd56891abf472b99085cf04f9237b5f21f28",
|
||||
"resource_manifest_sha256": "92a51de578be0e7c37d21e94caa3f22503f7d88b73827a5fce109b1b889e5d18",
|
||||
"sources": {
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "6884c7209f007ab9ee742b9c3c73828cfa1c6753d35b5fe25a87cab5955b33f8",
|
||||
"tools/test_native_client.py": "6c615fed67fd7bcf09b3184216e08a82012049880a0d4da7c89f86553090cbda",
|
||||
"crates/horizon-client/Cargo.toml": "d56524457d761c2613c0699b20e21ad6977d93e009d59ef150bbd9fc20d7a025",
|
||||
"crates/horizon-assets/Cargo.toml": "2f2cffacec0b4e22dd7cb032d594289bc51c94ae6cc4e985fee3e310f441d751",
|
||||
"crates/horizon-client/src/assets.rs": "e595afa610e0425d0b3ad694218794bf9e680e46ae80f3925c278ef1a823c914",
|
||||
"crates/horizon-client/src/camera.rs": "d386a56ca8fb3b37ba2b2ed9d09342f61b409a575bb21590e934120b4ccebfa6",
|
||||
"crates/horizon-client/src/clock.rs": "4851ada3e8e65d935eda8c0b57d3b51233b34f74aab4f040fd53db0e0d40b8df",
|
||||
"crates/horizon-client/src/collisions.rs": "112286b07c4cd11b36da8b6799e0e069e69dfddf9a8a3f9ce36dcb282c791d67",
|
||||
"crates/horizon-client/src/health.rs": "b5e2d3cde4bd58d906e6f6d47cd756ed23aa6706c71b10c3aedde30c11806403",
|
||||
"crates/horizon-client/src/hunger.rs": "01d8a35f570f2a0991ac17a078f2066a5a83037a728158585765723d208b4611",
|
||||
"crates/horizon-client/src/input.rs": "55b259ca6425c502270e7abc4d3ae1b3838633e2bd77d3817c6e00d9143a2beb",
|
||||
"crates/horizon-client/src/landing.rs": "b9d0ecc5ec60a09d75ab9fe778e0a2e5bbb36fd8364a7ce996405f3dc9cb3b9f",
|
||||
"crates/horizon-client/src/lib.rs": "d34c467ee87b869c6645052f286305e218c80ba258603317e9d951f1b4c5345d",
|
||||
"crates/horizon-client/src/main.rs": "14a459150f8dcc0a9bda2d91138e7e232d1e33e7b5f15fa17af8228653cbca2a",
|
||||
"crates/horizon-client/src/mesh.rs": "4ac8d85b30f599b37a98b92adcc016b16434816b93c401bd39b8215f591f9330",
|
||||
"crates/horizon-client/src/models/catalog.rs": "620103719167fc9ab76e730d68eeacb50014e95b7ad209ae7adf2cbbe69f70f7",
|
||||
"crates/horizon-client/src/models/cube.rs": "1067229f9dd9b276950bf7ec0c5f67061ce3d40a21932dca8034b9748e7439a4",
|
||||
"crates/horizon-client/src/models.rs": "98dd3b969947c2b297862a934e6235067ddc1fc8cda5adcc6276d19014d4b048",
|
||||
"crates/horizon-client/src/motion.rs": "1949f35da0e65ee71c52f53a2faf22601fbbb43387fbd411d6c9281b2221bc42",
|
||||
"crates/horizon-client/src/render.rs": "75cb40c257cf61e51009d292a06cd96532f59320b12ed7c3a509bbdbe1accdd4",
|
||||
"crates/horizon-client/src/sprint.rs": "6f5ba5ea8e9a19872b26c1d7b5073e29549f2d820a0fe46e5450c9e7446e98b2",
|
||||
"crates/horizon-client/src/sprites.rs": "292f844a31f6e8884008df9630e2b8862db1acfbc4640cc07d526e25f21f0bc5",
|
||||
"crates/horizon-client/src/world.rs": "0333ecf3e18ccc63117295feb2cf77661462ba13feb293eeec667c12811423b5",
|
||||
"crates/horizon-client/src/world.wgsl": "972a58ccb34e9965515adbb30c47a93fceca5b742390db6d9f69cba1ec31f559",
|
||||
"crates/horizon-assets/src/animation.rs": "ebbf7952146a0e66b41396174492f5702627170b03a57e6cd5a45c97a08c975e",
|
||||
"crates/horizon-assets/src/bake/transform.rs": "a95e658fef85b21bcb2f9f7512f98f98d57022d62c1199885b7133beae35a09d",
|
||||
"crates/horizon-assets/src/bake.rs": "f55dda6b6cee5ac6e65a8ee4837fdd2c6674437d59e59b4c45718f6324d4a4d5",
|
||||
"crates/horizon-assets/src/blockstate/bind.rs": "6278962e55c9786bba8184bdf2939af9c6e3b9002b08c3022129964b49a60009",
|
||||
"crates/horizon-assets/src/blockstate/choice.rs": "5a66c8b9833e2f19dd8b0773f3593d97ff5941d3c5b773896b98049efa1395ba",
|
||||
"crates/horizon-assets/src/blockstate.rs": "a4299dfd7adaeb4173982ffaa8e9c9eda2925739ae579a714193c99da2e7ce56",
|
||||
"crates/horizon-assets/src/json.rs": "99fe8af4fbf5d4eed408a92e829ac1a39597a0d92471a6bff73771fad9c830a8",
|
||||
"crates/horizon-assets/src/lib.rs": "e39f21c59a2c3e1c53d977b29bd5e0638e5fc41d86ff0fcc1882a6d90fd961e4",
|
||||
"crates/horizon-assets/src/model.rs": "57ddb3d65e88e7a8aa22c62bc298a2dae7f4e994326a873a31f06c0f36ed051b",
|
||||
"crates/horizon-assets/src/resolve.rs": "3927ac926cdcbd7d334901cc32d0ecc1e498b1bec98f76a46bca6d4964c13541",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaGallerySelectionOracle.java": "dc5433f1ce1de629b30cb70f031a43a691fc1df1fb218ce23de89769c164d562",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCuboidModelOracle.java": "7526f20513c549483122ab0d5ad24b9e87f38dc2f6aae55addd701a91ac85e43",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
|
||||
"tools/test_model_baking_parity.py": "392ffec44918fb91740ca4a1316d684480d39f14bd34d46175f7f44946d15bd7",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"tools/prepare_native_client.py": "159c12846058954a35ce86d415dc12fc89a6f11d46d21d1616ee686b7af4eee4",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/border.rs": "1386f8080521231d05ba3e84d94a3e1d5218d35ccb3d5e9fe2bbb05a8739e573",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "c650386f9860e44a96c55f18c8f1428ca715fcb0bc5c2434db5b1caa43df27fe",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "bcfb452752940ce53ae6dc267a3c4eb29459046a063c1f884684ab4f4bd0068f",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/Cargo.toml": "18bbad377a8047e4d4ecd0fc87d83d46d1c0f1ce2b8c47bbe64633e7b4420b57",
|
||||
"crates/horizon-world/src/active_effect_tick.rs": "88f19cfc3532c47a58c646bb3e9d99ff239a900752302b6a444dda3013e95cbf",
|
||||
"crates/horizon-world/src/active_effects.rs": "daaf352a69511a7d69fb329997f783b86585e486e0379c84ab0a55641771646c",
|
||||
"crates/horizon-world/src/attribute_health.rs": "1420a80787d10dd2e2954a3ee6193ff313289d00c7c78ca26ece8bafa21f4380",
|
||||
"crates/horizon-world/src/attribute_map.rs": "3d871cd530f5c035e0753f3ba065c2b9c5b49cdee75d4119f7dd584b22af67e6",
|
||||
"crates/horizon-world/src/attribute_updates.rs": "4cb322d75a50d222298994607097ba7f7e6674021128fa02a98a74c057ad05f1",
|
||||
"crates/horizon-world/src/attributes/entity.rs": "64ac99682a3aa06b1fb94b776b47794234c76b1cf70f1f54933d51e545e69279",
|
||||
"crates/horizon-world/src/attributes/live.rs": "8198c45134f69135d48ef203e71b6e702529568fd1ed9174d0aa843570bbf9e7",
|
||||
"crates/horizon-world/src/attributes/mod.rs": "5c2fcbbde58c19261874d227ea98332f00336c9fa53446da2e9adb6aa64a5e5a",
|
||||
"crates/horizon-world/src/attributes/operation_map.rs": "fc5bc8921d78ea6721a2eaa915e67483e2a33683927467bdba24f0492356ad97",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "39207247f2f6dd3ddc77640229044246f91b32054563f88a435f1bd92ad2092c",
|
||||
"crates/horizon-world/src/block_collision_scan.rs": "20802862364c110ff85eeaf48606596a8468b83768dda46b412d337958790b41",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_entity_push.rs": "12ee91bf604946234b24a0da4333f07d1830ab9743a422d41c8d0afac7d49cfd",
|
||||
"crates/horizon-world/src/block_landing.rs": "33083fe39266fbefec1b3ea1a19f2afc609791d189da247c895e116ad6eb266a",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/blocking_item_damage.rs": "afea3cb5761e8b82ee4d9bb4ef3c6fd10182a324dbaec99e6c9ebfac255dda09",
|
||||
"crates/horizon-world/src/blocking_rules.rs": "83c5e2105cec56a90182ce582e1c67ade2b189be6de1a34d08035000cc07c492",
|
||||
"crates/horizon-world/src/bundle_weight.rs": "a0e7b0587ab5d46cd55588f25d55a088b7a4725099c13ba6df146957be36014c",
|
||||
"crates/horizon-world/src/chunk.rs": "795895284d6e615bcb2082fceacdfe7025c152fb2934bb43f598f17a00ab46f1",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/climbing.rs": "6cd2f919872ff0b726effddaa57eccb805b8eae43f9d01144716010853891879",
|
||||
"crates/horizon-world/src/collision.rs": "a749794d5c27ccd6c0d964ad02f9dc31d49d9f4fe4b7366cd4bd8155e681b00b",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/combat_rules.rs": "01131f70d1acdd96a910e7f96deaa12e51a1e3bb9208085f04e3ec7b657d3cd4",
|
||||
"crates/horizon-world/src/component_durability.rs": "37a46e184f95bc5027e2b9af72ff52f729ad03601d08e1827f181fca383a35af",
|
||||
"crates/horizon-world/src/component_patch.rs": "f6f8992f241dfb25e012a06a7ba3fecab8d958686dddd096595a4806e56f0ab3",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/consumable.rs": "ba3575cb85866cb940f33a1ac86455d71cf0cc6395b848588a8ee1fe33f5c326",
|
||||
"crates/horizon-world/src/consume_effect.rs": "03f2aac6879ce133347d42f6f6667d62c06d956ff9faac5dc14182a788b6a236",
|
||||
"crates/horizon-world/src/damage_immunity.rs": "fd39c41124d694e755cf7faadcf93c636df4042c78ec345092a856b5f952dbcf",
|
||||
"crates/horizon-world/src/damage_reduction.rs": "f5a599ab11e077f526237018aeda803ea3c420c5b35c78ae9d85e32267e23bf3",
|
||||
"crates/horizon-world/src/damage_source.rs": "24945e397a926d34695652980923609e4723e02fe6b6e56d4aaf673e45d759f7",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/edge_backoff.rs": "5259d7aa44e64f88351d1556c44dd0edcad3b400a099c659755792efba7b5773",
|
||||
"crates/horizon-world/src/effect_attribute_modifiers.rs": "0bc7ab63d0f3f34a7133fe20364cae0ec1fdbd3773cba90faa1f08e0d63a5646",
|
||||
"crates/horizon-world/src/effect_notifications.rs": "ea66bfa010d6d44aee97b9672902f41cd99d0d80239f41c6d4eae5c9a9472d3d",
|
||||
"crates/horizon-world/src/effect_particles.rs": "a42dc4ec55929dce1db0f22f8816ecf7621fdce1cd2ac0c90f6a57fea4e0afd2",
|
||||
"crates/horizon-world/src/effect_sync.rs": "1388d4a69b42a14ff4cd474f5e36f0fad5a2874031e64fa2b19b2ea179deed2b",
|
||||
"crates/horizon-world/src/entity_collision.rs": "09f2fd7f6cd56fc282f468ecfa765a94506929e9684bd3a5c90123e5b51cd627",
|
||||
"crates/horizon-world/src/entity_fluid.rs": "02991040ae879a8914f09913128a3506e9e7a1ca33ffc0a22b5729a168346600",
|
||||
"crates/horizon-world/src/entity_fluid_tick.rs": "4f9e070b88a73c98a4e2e659360ddd6edee636bca29377f1ea9011fd5a556f64",
|
||||
"crates/horizon-world/src/entity_move.rs": "a40a50d3e841625a75d4cfbb7c2630ab5a62a574456567e7234f401ae8441b32",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/extra_items.rs": "6eba0a0c795d5fd841d31471708e78324b4852adebb2e6ed700dcc0caab668cd",
|
||||
"crates/horizon-world/src/fall_damage.rs": "8c28e2933493569fe05dea22332024287d28b0746b514dd465681040b003296b",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/fluid_box.rs": "b586af72b1c04a9354fe66205c28dc8b619e205ab9ea19a68232722e4b6e96c1",
|
||||
"crates/horizon-world/src/fluid_flow.rs": "7c7e486b5c565df3602799648b37b879bcca51414337f607962d6c7951b86d05",
|
||||
"crates/horizon-world/src/fluid_occupancy.rs": "26037579caeef6c8a5a2bde2c3d142d278558b76d77ebff401cee6e35f2ea961",
|
||||
"crates/horizon-world/src/fluid_shape.rs": "28bb65a72f5bd074a354ba38a1b1707fcb0947537977a11540bba0adb85995c2",
|
||||
"crates/horizon-world/src/food.rs": "3cf416fa632a5555a8116bb528a6e80bcb5b6b754b0748b4959ed310102418d3",
|
||||
"crates/horizon-world/src/food_properties.rs": "0926fa3f3bc3d0608c45d02f564355825ca3c3526a82bf9c1375c7a191fa5e12",
|
||||
"crates/horizon-world/src/food_storage.rs": "58c433801a285efcc973638c11d694a41f85dc96703a3a7ce8d3673f3eb31d52",
|
||||
"crates/horizon-world/src/free_space.rs": "913536bf4c85ddeeb378d76d1b5110b4175f5688e1a749f32fe6a6d86fbb478e",
|
||||
"crates/horizon-world/src/ground_support.rs": "3e371d74ecede4d30beef0a7e8a2ee33463584a5b1ed3d852b394efcce1ffbe0",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/identifier.rs": "37c921889c4f5d91f7c09ab2ee68d1a5e5a3c4fb1c49b4b189c987b4615fd2d6",
|
||||
"crates/horizon-world/src/interaction_shapes.rs": "f321284ddab440a394372b6dedc8b5cc29a653c0745251a9e96c650f21c33dea",
|
||||
"crates/horizon-world/src/inventory_pickup.rs": "ea830c7916e7f2d95c6db7ef48be1e876e6ebafcb438e47fc72f9a5bd7c37d07",
|
||||
"crates/horizon-world/src/inventory_tick.rs": "293a3d57a1689337cfd58e5a73dcdbed4cb360f94d98ff5458f0df92de387365",
|
||||
"crates/horizon-world/src/inventory_use.rs": "6a6c2ecc73c83dda4cd798c0304df12ace6096eb110d899f4f0c7ffd852bf001",
|
||||
"crates/horizon-world/src/item_after_use.rs": "2b6598ce5b7b304dea2c8057b4a1eb6530264ac4d0546c3da0c76deed9609da5",
|
||||
"crates/horizon-world/src/item_blocking.rs": "f6eee0d6d177cc3148960122327ba1b459a2f0e85241c1d9a3e40f0b8c169296",
|
||||
"crates/horizon-world/src/item_cooldowns.rs": "7b625868509ab3c51e72db0ac714bb0e7ec5e2610d37271005a1a737f4d14431",
|
||||
"crates/horizon-world/src/item_durability.rs": "9fdf835e5c7bd0e1dd63ef2ba0076b770cdd4d6d14cdcd11de27690f0702f94e",
|
||||
"crates/horizon-world/src/item_particles.rs": "861b14f65adb9b14f8158fe9f0b7128beac3df8107b1337c31b8b9b49434ba3f",
|
||||
"crates/horizon-world/src/item_stack_refs.rs": "18d3ca85cac0daf59200857513761359e5690f719cb3f7f64ae552f0c4169ea3",
|
||||
"crates/horizon-world/src/item_stack_storage.rs": "b4dcb83dcaa346848c5484161feb3e2cf08e83f7793d7ed83be25b14b9d12884",
|
||||
"crates/horizon-world/src/item_template.rs": "dc80025215d1867e656924ea2a9d273aacbcaea21293d986ba42d0004ee93b69",
|
||||
"crates/horizon-world/src/item_use.rs": "b1c79428986efbf9dd5ede703a39eb387fb6dcc7d9950f0e49243a353a5b8070",
|
||||
"crates/horizon-world/src/item_use_catalog.rs": "a9b53d2e816583239a75c3c61e78dacc5e3b27dee595be34b1c7fa169f17a571",
|
||||
"crates/horizon-world/src/item_use_lifecycle.rs": "4639b70440cf811e79de09c48a3e035143fcb6be8a64c2f61b10ae55a2f133b7",
|
||||
"crates/horizon-world/src/item_use_start.rs": "a84092dfb8b8f0a89d0928bb2f8ac252bd9bfd3f8d74fce1a7f7a5b3c3f4f50b",
|
||||
"crates/horizon-world/src/java_hash_map.rs": "955502e696d7b0b33bae3ec485c8eb1453a8956116aad68226cf1fc67d60babc",
|
||||
"crates/horizon-world/src/lib.rs": "e25b3543c07f31c2a9d23d811792de9a33290263c7c7445549a0682f6935d8a5",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/live_attribute_updates.rs": "778171faaaf7077deb0b62c4cc1db16351eba41adb8bb07656ba65e827056199",
|
||||
"crates/horizon-world/src/living_air.rs": "b2de36bb50bed15e2808fe4a874fcef07f9fea0d2c96385b7b5e8ee9560d4442",
|
||||
"crates/horizon-world/src/living_damage.rs": "2b448209629b9bf2e678d667ad0d6c7fa22146892dd106b169d96b31b0df12bb",
|
||||
"crates/horizon-world/src/living_fall.rs": "da0f176f4731e1c86e08bfeee8167742fd1b86380ff0e9304c13c1ce3f1c67ab",
|
||||
"crates/horizon-world/src/living_fluid.rs": "d7cd914cfb2a1f4876ce0ae95e999bf0ff1af732cce3ab4a3aa2d1ab881c7339",
|
||||
"crates/horizon-world/src/living_health.rs": "221659f85552424e937d503bba6d8003006b106ced042b32d3a6f6cc23e12ed0",
|
||||
"crates/horizon-world/src/living_hurt.rs": "844239ad7d15c39629bb3cfc06ebae6d1cff20b7627468f26e0ee8dff3abdcb8",
|
||||
"crates/horizon-world/src/living_landing.rs": "8bca4eb7977abc2b14fb7174be4ea355352106ea1e76ff5f3ad8696969d9eefd",
|
||||
"crates/horizon-world/src/living_motion.rs": "56f8c84cfbe205a7a69912d5f76b52ef1efca149c1b6801d4684e25fb179aeb9",
|
||||
"crates/horizon-world/src/living_use_flags.rs": "826f4fdeba7e208368cbbf910fa408db0afbc6442d842d178a70fae53e0d0ea6",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/movement_emission.rs": "76e7d6f5b19c94676190f54389f9c4ce12cf89945ccfcb9c750de473223e7753",
|
||||
"crates/horizon-world/src/movement_properties.rs": "6f01ab920b376a13f5ae12c3718f4dd067e1dff2b829585af00a8b2100f3775d",
|
||||
"crates/horizon-world/src/movement_restitution.rs": "04b4fe0947e7e52576145bd8ed15920278e8a538afcc74d125eaca513dffa0ef",
|
||||
"crates/horizon-world/src/movement_statistics.rs": "fe28061e29c41f8f399d29cce8c468a63854613702b5aa525c0f0fd98cb87f9a",
|
||||
"crates/horizon-world/src/movement_support.rs": "02d85cf572847f2e60b5a7f9d60b856888a67b3c1f4df03e81998c66fdf874be",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/object_open_map.rs": "b4934a9cc38df93ed206ab0bc3bbc4499acd8e40b41b7def7d47067b7170065b",
|
||||
"crates/horizon-world/src/object_open_set.rs": "d3e0373bf1b652dd054345d5a8e25ec828e06dd7cad65aada35163c95df4e637",
|
||||
"crates/horizon-world/src/piston_movement.rs": "7a3fd2549a582b5f3a5c21aa05d67d944d62ca1105856679e100ac5b44e9a52f",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/player_equipment.rs": "1fa8c53e67624c4641246249d79a800a28a4858c62482bd880b4e3b866b936ef",
|
||||
"crates/horizon-world/src/player_food.rs": "f188dc110745bcc7acc15e6c521db943b06b404f69cd251bf74a345516070304",
|
||||
"crates/horizon-world/src/player_health.rs": "8155b315453c569db2fbe46228886c5881d1fd55eb095c5849e69bdb500ba2bd",
|
||||
"crates/horizon-world/src/player_hurt.rs": "99c9bbd8587ec2dc287806049897b8034d2f5349ad47fc497b70d54148844a36",
|
||||
"crates/horizon-world/src/player_inventory.rs": "f4f67d8312793f25930626c4ac06db688fcf2e2292d6675071d105fb1708d952",
|
||||
"crates/horizon-world/src/player_travel.rs": "6841a677a900495eb6223031ef3ebe8d859bb98908dda0e2209e5f28839dc593",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/registry_collision_scan.rs": "97cc950a9a4ba387b78e368f36d595f8664ab7730d132900d220ce23b92826ea",
|
||||
"crates/horizon-world/src/registry_fall_ray.rs": "52935436132df505691144840dcbd858b15d00d8305997284e3a542ecf6bc0dc",
|
||||
"crates/horizon-world/src/registry_fluid.rs": "b8959c05850cfeaaad1e4de8ca7c7d0d6ac56da9b2c1de3ebefa5871a11ed35e",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/server_player_combat.rs": "0a94885c4b7a0d294ba7f4cee18b96ee59649b50112988250b53cc224059a979",
|
||||
"crates/horizon-world/src/server_player_damage.rs": "29af22dec321fe01776cee5334f050c5bc3e27a688f99c8c3da4c0ad8bc8254e",
|
||||
"crates/horizon-world/src/simple_container.rs": "0fedbc7e974b1db79b88bd6aff977654189a5d553cf42852fe8bf0885cf90b30",
|
||||
"crates/horizon-world/src/status_effect.rs": "588bfcf4d93f50be86cb89545bd5c431edbc71771f704ff55cb52906b1964c37",
|
||||
"crates/horizon-world/src/stored_consume.rs": "621a52c9fba447c393e561f881a16cf1f97d336e3a0ce493725ef51e2db12ffd",
|
||||
"crates/horizon-world/src/stored_effect_attributes.rs": "c79f6a52d3cfee1a5288225bf8fa91a7bf3ea8cd21faea9f6dc748ecefc6309a",
|
||||
"crates/horizon-world/src/suffocation.rs": "bed219dd5bbab6263b98fbe3d0eb512cb96c52ae847210efe49514d05f22f11e",
|
||||
"crates/horizon-world/src/swimming.rs": "49d2dae13c109b37ff832cde98a857944ff45247b864a527b9c4f03ecca7a7b7",
|
||||
"crates/horizon-world/src/synced_floats.rs": "0152f2752bafaf68769d56dbc88494a976496a680c6b113d6b48a446158ba072",
|
||||
"crates/horizon-world/src/synced_values.rs": "a1d4b53ae77d1899ba2b4ead67c9ec1e3c96615558e446f9d0760c1b4a520169",
|
||||
"crates/horizon-world/src/teleport_consume.rs": "d6a53bbb6ac4dbbd4c0591d0646017898a95beb8ef093dc5d81b9833963be6c3",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/use_remainder.rs": "f555335afeca7970888131a6da2f5a614a73253b631185d1ba804593a349535e",
|
||||
"crates/horizon-world/src/view_direction.rs": "e18120ae26dc5cf702b29fc4c8487088bab133c8ce5abce01226833fafb0d5a4",
|
||||
"crates/horizon-world/src/water_splash.rs": "e0461ae1b2e8c851cca6e3251a188334293292201d7f80dc9e7d60fd1815f4d1",
|
||||
"crates/horizon-world/src/world_movement.rs": "f8fe9e34f2395d2a04c839d1c8ba78e09ce493c26de6f6e4e237b9c19c061da5",
|
||||
"crates/horizon-world/src/world_ray.rs": "879bdbbe12f56deb705cc183933431489e840b71eade40c33391eed5949c2e61",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "74e4110fb19c4c4047192fd65c38015b8afc7f9fc50404d75380b5063808148c",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f"
|
||||
}
|
||||
}
|
||||
@@ -1,203 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 8338,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "b9c34e7f7a7c14001e03373cbbd468a228c5301eb639460b4ce465d14e946113",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "f0997b21c8083de75f4f8883e8855e1d2d9f1876a2053a8a97b081deed5b0bcd",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "b7bf0f48f7dc0129c1ebe43c11cb4cad00194b501c2bcbb3220bc8779e695ba4"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-collision-context-parity/inputs.txt": "60b49e91a7a4999cfb8eb6ac3fbc6ec0a931d68cd53f9737959a2bd2b42be7a5"
|
||||
},
|
||||
"rust_output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
}
|
||||
],
|
||||
"scope": "Actual CollisionContext factories and EntityCollisionContext/Empty/PositionCollisionContext queries on controlled player and marker snapshots. Checks entity identity, captured descending and placement flags, fluid collision flags, empty-stack AIR identity, height thresholds including f32 epsilon, null factories, callback arguments/order/failures and all five fluid type pairs. Entity lifecycle, inventory mutations after capture, experimental minecart contexts, contextual block shape dispatch and live movement integration remain pending."
|
||||
}
|
||||
@@ -1,205 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 58344,
|
||||
"block_states": 32,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "b9c34e7f7a7c14001e03373cbbd468a228c5301eb639460b4ce465d14e946113",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_liquid_collision_parity.py": "dd77dfef7d3a66e81d92b66680d9626b6d69c54fc742bf5122674f05342fe788",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "f0997b21c8083de75f4f8883e8855e1d2d9f1876a2053a8a97b081deed5b0bcd",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "b7bf0f48f7dc0129c1ebe43c11cb4cad00194b501c2bcbb3220bc8779e695ba4"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-liquid-collision-parity/inputs.txt": "564e80e9a55a186cd70c21a1db14abf59849be90bc5493346e9e64ff9d3c9d8b"
|
||||
},
|
||||
"rust_output_sha256": "d845ce538e9ce157f6455b32e73e03e9d7df86ebc5c9ab80ebf94705500748ab",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "d845ce538e9ce157f6455b32e73e03e9d7df86ebc5c9ab80ebf94705500748ab",
|
||||
"matched_output_lines": 571179
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "d845ce538e9ce157f6455b32e73e03e9d7df86ebc5c9ab80ebf94705500748ab",
|
||||
"matched_output_lines": 571179
|
||||
}
|
||||
],
|
||||
"scope": "Native contextual LiquidBlock collision dispatch for all 32 water/lava states. Checks the always-fluid bypass, source-only selection, living-entity gating, supplied entity standing shapes, exact height boundaries, all 33 above-block fluid states, callback order and failure propagation, null/placement contexts and wrapping above-block coordinates. Full selected shape data and callback traces are compared. Entity-specific standing shape implementations, liquid simulation and live movement remain pending."
|
||||
}
|
||||
@@ -1,205 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 56448,
|
||||
"block_states": 32,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "b9c34e7f7a7c14001e03373cbbd468a228c5301eb639460b4ce465d14e946113",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_scaffolding_collision_parity.py": "bab75e2cad68a3193035a87497eaa372466c405293cc547e39dbd7bd4450d69d",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "2176c7034e07f547510a8327cdad9d3b63f26e4754032b76b7d5fe13166c333c",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "f0997b21c8083de75f4f8883e8855e1d2d9f1876a2053a8a97b081deed5b0bcd",
|
||||
"crates/horizon-world/src/liquid_collision.rs": "0f0a83b04e5a5bc9d98ed05fde4d6584ba69642e93522e726e4cfc325d6fcb1d",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/powder_snow_collision.rs": "7289946a21478d11abfd2bdcdddff3d7f98e25bf6a68564fed45c3cc01ac2a36",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "b7bf0f48f7dc0129c1ebe43c11cb4cad00194b501c2bcbb3220bc8779e695ba4"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-scaffolding-collision-parity/inputs.txt": "5945054e86700237a7b6de6b362a37a98bdc8afaa67004e8aaa92da1421b552c"
|
||||
},
|
||||
"rust_output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"matched_output_lines": 524300
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "33a33cd612c999ab21f1acbbdee522f2ec2b3f877d62f922c665715e3012e207",
|
||||
"matched_output_lines": 524300
|
||||
}
|
||||
],
|
||||
"scope": "Actual CollisionContext.getCollisionShape dispatch and native scaffolding behavior for all 32 scaffolding states, nine context variants, descending flags, integer Y extremes, nonfinite positions and adjacent double values around the top/bottom float-epsilon thresholds. Full shape coordinates, extrema, box ordering and cube metadata match. A rejecting world proxy verifies selection performs no world reads. Scaffolding placement/update/falling behavior and live movement remain pending."
|
||||
}
|
||||
@@ -1,201 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"fixtures": 8338,
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionContextOracle.java": "ee1525cc998c8b49fbc5318efffcec7b98cc8be3e4755d3bfc8458ac3c5e64c2",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaFaceSupportOracle.java": "9ce939a435842867786fed648951bbe77f6ab843f6df09af15f3deb1948c4877",
|
||||
"tools/test_collision_context_parity.py": "75d6f01e072867d2bd286d2e518e123fcfe055a11ac1705ec99ecec3975cb8d2",
|
||||
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"Cargo.toml": "3f93319c1eb70dbd7ba25cd74ef343fbf35c52c7c4752f955605c58699cbff9d",
|
||||
"Cargo.lock": "cb1e87d449114a63edd904c0559d631e8fa9feeb27efd6539aacdcfeae178876",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
|
||||
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
|
||||
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
|
||||
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "4255e16837fde42a52ba118f60581d197c571bb530b60d635e506184ebf4db0b",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
|
||||
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/text.rs": "e6553ddb5db5039e8dc4614b6a6dc9f35a26dc3d1673b68a04e72e7983b67abb",
|
||||
"crates/horizon-core/src/ticks/generation.rs": "be1237e790693f633a61714ddae68c6506a777588a8a3ab5efbe53a35774dbd2",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "01634630668172516b8b79d0907bad47f6e2c543a6d499c2fa4b201823b375cb",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
|
||||
"crates/horizon-world/src/block_collision.rs": "a40c9d7a4e0a734c124dc856e31359fd4d8de3d1bfc79c86787afa8e8e05e480",
|
||||
"crates/horizon-world/src/block_entities.rs": "a9deae92e6e5a1fcf4f0476c33ea4d170ddad6fd4b3303e1bb66d933973d5e06",
|
||||
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
|
||||
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
|
||||
"crates/horizon-world/src/block_render.rs": "8df52ee11aef406a1571198a64048062a0ef6864e0058d9293a57f64b73c916a",
|
||||
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
|
||||
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/chunk_status.rs": "dbb8583cfa775203c544d24d69e03720385428f15a267a561356c21f5025e9c7",
|
||||
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
|
||||
"crates/horizon-world/src/collision_context.rs": "3053db15dff5776571a2c919634362fe43100978867f9e3ac46b2299563a6d4d",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/dynamic_support.rs": "5996bc1c436fb6215d8fc3d0bb4de5dd9b966d842d432580d624195771697fb8",
|
||||
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
|
||||
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
|
||||
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
|
||||
"crates/horizon-world/src/lib.rs": "8f77b4a1c5e25ecf9336477c12e3141fafc0cd8884f3b198f2ec93b0eb47ae49",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry/json.rs": "7a683afcd1742c5307756927d7f0aa779c7d7992af87d8d371dd98108728e235",
|
||||
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
|
||||
"crates/horizon-world/src/retrogen.rs": "6efd36a6293756688c1990a7965bd65609d7c5e2bf2a5f4f01d54932d2b9386b",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/bamboo.rs": "d9b47113c99be34256e58308bc6f40072ff25c579d6bf995182aa862c0006102",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
|
||||
"crates/horizon-world/src/worldgen/biome_chunk.rs": "8fdfe6ebe3ffeca97611fd5991a5bc6b2783ea1c62f4d8ef3b2dd53c04a5dc1d",
|
||||
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
|
||||
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
|
||||
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
|
||||
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
|
||||
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
|
||||
"crates/horizon-world/src/worldgen/biome_weather.rs": "96b1f9494559ed31d06257b83d604d00cc069ccc8c7b68094117e034b4a71bd7",
|
||||
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
|
||||
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
|
||||
"crates/horizon-world/src/worldgen/block_feature.rs": "36b4e46ee7f7f73bcb94d8bce8d99013e4b16234c9a03542eeb3186e88dd1c21",
|
||||
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
|
||||
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
|
||||
"crates/horizon-world/src/worldgen/blue_ice.rs": "eedd77bdaff808330b864166d303378096daa5c7d235e925770b171c05109247",
|
||||
"crates/horizon-world/src/worldgen/bonus_chest.rs": "05d0f63fbc7412f13ba1fa37a7238114b8f70bfff318beb2dece590482d49cc0",
|
||||
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
|
||||
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
|
||||
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
|
||||
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
|
||||
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
|
||||
"crates/horizon-world/src/worldgen/chorus_plant.rs": "29224c164ede919e280a65a68f155c873e2c8fd0aa7d7e244d8fa9e468760250",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
|
||||
"crates/horizon-world/src/worldgen/delta.rs": "c2bf49ddf3231d28c109e68871429bc13d76a7bebe14eb33e84aa856bdd66145",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
|
||||
"crates/horizon-world/src/worldgen/end_gateway.rs": "f53fde77d6a36a525cd15d890003b2c129d0689a4cbfa2cf443a0c2e3acae040",
|
||||
"crates/horizon-world/src/worldgen/end_podium.rs": "8f6d0d6d60ff0fde63de5781e867239db321f82cf12639f0537d410a3731ee1d",
|
||||
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
|
||||
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
|
||||
"crates/horizon-world/src/worldgen/feature_graph.rs": "da132fca9fdafb0d89a917d5f4b68c60b70fb33cadf948a107da0e35d83dcd91",
|
||||
"crates/horizon-world/src/worldgen/feature_region.rs": "df0ff142a461cafa9a3b42b949ad3376887f2be8d4ea5cc794a3ed2e977bb499",
|
||||
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
|
||||
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "64197c9e63bebf1ce04bc280bfe980bb6c1b9aa887ca5cded904aeb0d9ae6c46",
|
||||
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
|
||||
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
|
||||
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
|
||||
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
|
||||
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
|
||||
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
|
||||
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
|
||||
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
|
||||
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
|
||||
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
|
||||
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
|
||||
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
|
||||
"crates/horizon-world/src/worldgen/placement/context.rs": "a278304795136677ad4b4933ea50c972b9729a1c671c03fa309c193e224b1fd6",
|
||||
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
|
||||
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
|
||||
"crates/horizon-world/src/worldgen/replace_blobs.rs": "bf3377d86d2570cd15288ba69dde64a2cf67c5bcbb9a31d0c23421964af74afa",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
|
||||
"crates/horizon-world/src/worldgen/snow_freeze.rs": "9040be3d5c7f8f0fd812d2df45e154bf8a9eeef038530b83fa4159d246eac35f",
|
||||
"crates/horizon-world/src/worldgen/speleothem.rs": "c71651c1c97818a8a85863e14414d6139ea3bdeb897fa422043bcc1499d99aae",
|
||||
"crates/horizon-world/src/worldgen/spike.rs": "eacf0d9d3d2bc3d4bcf62bc87555f90031138236a5bfef0eb5270204f7c2a4fc",
|
||||
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
|
||||
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
|
||||
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
|
||||
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
|
||||
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
|
||||
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
|
||||
"crates/horizon-world/src/worldgen/terrain.rs": "fd1f2e0afc15daf66f484ea40a1f2b7013650bda0941b23c64c81ee9f79cb673",
|
||||
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
|
||||
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
|
||||
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
|
||||
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
|
||||
"crates/horizon-world/src/worldgen/write_zone.rs": "8e17a179764d3f68c05882aef35f6810c28a0000f9a83e58bd6030660b76e64e",
|
||||
"crates/horizon-world/src/worldgen.rs": "e8e9f099ee1fcec8eedce31805d676d3f89c18e84f494a147ffcbfee23d3d54f",
|
||||
"crates/horizon-world/examples/collision_context_fixture.rs": "c4df3b01bf9d7e58076c848fbb41f93677ea4f0fdaab768a131d9e77c7bee5cd"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-collision-context-parity/inputs.txt": "60b49e91a7a4999cfb8eb6ac3fbc6ec0a931d68cd53f9737959a2bd2b42be7a5"
|
||||
},
|
||||
"rust_output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "7b23eb34c86c3db5a9e90bdd8ef772b79b2a06c8460542e032589f7962fd8f64",
|
||||
"matched_output_lines": 225126
|
||||
}
|
||||
],
|
||||
"scope": "Actual CollisionContext factories and EntityCollisionContext/Empty/PositionCollisionContext queries on controlled player and marker snapshots. Checks entity identity, captured descending and placement flags, fluid collision flags, empty-stack AIR identity, height thresholds including f32 epsilon, null factories, callback arguments/order/failures and all five fluid type pairs. Entity lifecycle, inventory mutations after capture, experimental minecart contexts, contextual block shape dispatch and live movement integration remain pending."
|
||||
}
|
||||
@@ -1,307 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"java": "openjdk 25.0.4.1 2026-08-18",
|
||||
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
|
||||
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
|
||||
"commands": 16770,
|
||||
"command_counts": {
|
||||
"noise": 2111,
|
||||
"quantize": 4116,
|
||||
"index": 229,
|
||||
"climate_parameter": 25,
|
||||
"climate_point": 183,
|
||||
"noise_settings": 217,
|
||||
"settings_create": 182,
|
||||
"aquifer": 9136,
|
||||
"noise_aquifer": 379,
|
||||
"registry": 24,
|
||||
"router": 168
|
||||
},
|
||||
"noise_aquifer_injected_failures": {
|
||||
"0": 3,
|
||||
"1": 3,
|
||||
"2": 3,
|
||||
"3": 3,
|
||||
"4": 3,
|
||||
"5": 3
|
||||
},
|
||||
"noise_aquifer_outcomes": {
|
||||
"1 false": 5800,
|
||||
"0 false": 9995,
|
||||
"default_solid false": 12655,
|
||||
"2 false": 35365,
|
||||
"0 true": 1114,
|
||||
"2 true": 2021,
|
||||
"1 true": 43,
|
||||
"5 false": 443,
|
||||
"5 true": 5,
|
||||
"6 false": 295,
|
||||
"6 true": 8,
|
||||
"7 false": 49,
|
||||
"7 true": 1,
|
||||
"4 false": 51,
|
||||
"4 true": 4,
|
||||
"error false": 17,
|
||||
"3 false": 81,
|
||||
"error true": 2
|
||||
},
|
||||
"noise_registry_entries": 64,
|
||||
"density_registry_entries": 55,
|
||||
"noise_settings_entries": 7,
|
||||
"biome_parameter_entries": {
|
||||
"minecraft:nether": 5,
|
||||
"minecraft:overworld": 7594
|
||||
},
|
||||
"biome_tables_sha256": {
|
||||
"minecraft:nether": "09e477f851380a6e726ea85fee39cd1d41c7f160fe424f58cb3f0056b5c11218",
|
||||
"minecraft:overworld": "6bc45ce2eed04b6afecdfaf2cf89273e83dad071aeb45638e181d33fe5180f57"
|
||||
},
|
||||
"fixtures_sha256": {
|
||||
".local/rust-worldgen-parity/registries.json": "c6868228cc1002755dab31d947e953cc4be785a1b6ae82697755817a238b7de9",
|
||||
".local/rust-worldgen-parity/inputs.txt": "4afb482c8aa6e654ef47b9696f76c16fa862414248202c9bf748941bfc8d0877",
|
||||
".local/rust-worldgen-parity/biome-presets-client.json": "b03e2fbe85c191a22f333bc989bd2a73c66f0f9fbcd9ddb54774f17c247832e9",
|
||||
".local/rust-worldgen-parity/biome-presets-server.json": "b03e2fbe85c191a22f333bc989bd2a73c66f0f9fbcd9ddb54774f17c247832e9"
|
||||
},
|
||||
"noise_resources_sha256": {
|
||||
"data/minecraft/worldgen/noise/aquifer_barrier.json": "864a9d66a03b081adc8d4bf51a6d0cd5fdd94a0ebf1cecadec2aed9e549db7e4",
|
||||
"data/minecraft/worldgen/noise/aquifer_fluid_level_floodedness.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/aquifer_fluid_level_spread.json": "6afc3f09b6616f799d739b5b114c4436059dcc60308af55fe96a8594de815214",
|
||||
"data/minecraft/worldgen/noise/aquifer_lava.json": "96e1c4e411ffe302c5541cd2ee8462e1992f0290d623c560f353c39981737346",
|
||||
"data/minecraft/worldgen/noise/badlands_pillar.json": "79c0d0628db949d3b83bbca145da427bcdc3ff585b0ad736f7cb20e4c593c9a2",
|
||||
"data/minecraft/worldgen/noise/badlands_pillar_roof.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/badlands_surface.json": "79365a5c2017e93878d989a176520ba9cbdf8685cff8b3cb148730d949d98b09",
|
||||
"data/minecraft/worldgen/noise/calcite.json": "331259d84572c32b4b268d069e0132da9e6623ba614080e34b815472c7f4ee0c",
|
||||
"data/minecraft/worldgen/noise/cave_cheese.json": "24c6846b7fc1f7c652bf185797fe98b943146b6aaf8766d1bff2066c59b7ed24",
|
||||
"data/minecraft/worldgen/noise/cave_entrance.json": "f75146a7b1a033998edd3c77319f78243fe933bdcda2067b78658940f145cac6",
|
||||
"data/minecraft/worldgen/noise/cave_layer.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/clay_bands_offset.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/continentalness.json": "b7ce5ac29a2c7a7cfbfaa1e1eeca9ba8f4a52139e59318850fa2407242c69ba8",
|
||||
"data/minecraft/worldgen/noise/continentalness_large.json": "76834cff0227d52b19b5932142925f4fc639e713c2180e489f813701ca45f53e",
|
||||
"data/minecraft/worldgen/noise/erosion.json": "af8a7a0f16ff3e568ad646df9cbc28e04a31b16dad4f162705c0f7c747da6983",
|
||||
"data/minecraft/worldgen/noise/erosion_large.json": "d20c2c6ec805a366b105924b3cee29ac5b84cc06d636b539ae0047aac413b60a",
|
||||
"data/minecraft/worldgen/noise/gravel.json": "87d627634161e51a79512f3d3f42f990d2a185e35198eb5e2161939d866751e0",
|
||||
"data/minecraft/worldgen/noise/gravel_layer.json": "a4b45bdb6efef2509b053b970f6e84250d7b16d54f3906bc7fcf2665ada2a692",
|
||||
"data/minecraft/worldgen/noise/ice.json": "85d03cc06d6bc552dc399dcc90ca9749c2625ddf0049dc0f95684631a7c6e66e",
|
||||
"data/minecraft/worldgen/noise/iceberg_pillar.json": "98816326f84a21ce29421a9cba3ad85e5a26069312c9819aaf5662691e777fd5",
|
||||
"data/minecraft/worldgen/noise/iceberg_pillar_roof.json": "864a9d66a03b081adc8d4bf51a6d0cd5fdd94a0ebf1cecadec2aed9e549db7e4",
|
||||
"data/minecraft/worldgen/noise/iceberg_surface.json": "79365a5c2017e93878d989a176520ba9cbdf8685cff8b3cb148730d949d98b09",
|
||||
"data/minecraft/worldgen/noise/jagged.json": "d64347f4f9acb984075e3b4945b4699907ec6d893588388dd8f738f29f75f4d1",
|
||||
"data/minecraft/worldgen/noise/nether/temperature.json": "5a67fbc28b5c2578b4ca5f6abdd115c715ea2ef1be3e1a7a8eb1a0de4c3a8f7c",
|
||||
"data/minecraft/worldgen/noise/nether/vegetation.json": "5a67fbc28b5c2578b4ca5f6abdd115c715ea2ef1be3e1a7a8eb1a0de4c3a8f7c",
|
||||
"data/minecraft/worldgen/noise/nether_state_selector.json": "116c8bf1d676fd3a3dea3908e074a4f4b7ee55d3263e93abf5889b41bfc77f5b",
|
||||
"data/minecraft/worldgen/noise/nether_wart.json": "4518b186ffe4b65394a35276c8708037c6f3f73c7cb95ef6d41a5cd4b8d234f6",
|
||||
"data/minecraft/worldgen/noise/netherrack.json": "cef60938a0304eec78a6bdebd24b80a45c5d1bad894c6c012e3413ecc485a81a",
|
||||
"data/minecraft/worldgen/noise/noodle.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/noodle_ridge_a.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/noodle_ridge_b.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/noodle_thickness.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/offset.json": "45f51565587e2dc055271648037c0ec3466815e82f0d762e0198c16285fc8ae7",
|
||||
"data/minecraft/worldgen/noise/ore_gap.json": "6afc3f09b6616f799d739b5b114c4436059dcc60308af55fe96a8594de815214",
|
||||
"data/minecraft/worldgen/noise/ore_vein_a.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/ore_vein_b.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/ore_veininess.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/packed_ice.json": "0f51993727dcb0aa7c6cb9288e462443e711e9980c12927435126a3c45922786",
|
||||
"data/minecraft/worldgen/noise/patch.json": "83a0052d4220c67c5513bce689d681e3af3325c18fec612cdd4941fc738f4be0",
|
||||
"data/minecraft/worldgen/noise/pillar.json": "5a67fbc28b5c2578b4ca5f6abdd115c715ea2ef1be3e1a7a8eb1a0de4c3a8f7c",
|
||||
"data/minecraft/worldgen/noise/pillar_rareness.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/pillar_thickness.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/powder_snow.json": "98816326f84a21ce29421a9cba3ad85e5a26069312c9819aaf5662691e777fd5",
|
||||
"data/minecraft/worldgen/noise/ridge.json": "e05d077746b27d662a8c981807819df3e3bb1f1779d2245dd911c8193e03bbf8",
|
||||
"data/minecraft/worldgen/noise/small_patch.json": "9ecc836feb68b42d717217e028f2a72112179f1097f5bd156b1d3f1db637732e",
|
||||
"data/minecraft/worldgen/noise/soul_sand_layer.json": "a4b45bdb6efef2509b053b970f6e84250d7b16d54f3906bc7fcf2665ada2a692",
|
||||
"data/minecraft/worldgen/noise/spaghetti_2d.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/spaghetti_2d_elevation.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/spaghetti_2d_modulator.json": "d210211c0c76c53f15908f0b004a7e98e9d753ed996cd5468f2068f2e23932d1",
|
||||
"data/minecraft/worldgen/noise/spaghetti_2d_thickness.json": "d210211c0c76c53f15908f0b004a7e98e9d753ed996cd5468f2068f2e23932d1",
|
||||
"data/minecraft/worldgen/noise/spaghetti_3d_1.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/spaghetti_3d_2.json": "e755b926628bc49edf48a3bd3b1e1bc3e2895b774f5e2e81f1d4340782a9fc56",
|
||||
"data/minecraft/worldgen/noise/spaghetti_3d_rarity.json": "d210211c0c76c53f15908f0b004a7e98e9d753ed996cd5468f2068f2e23932d1",
|
||||
"data/minecraft/worldgen/noise/spaghetti_3d_thickness.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/spaghetti_roughness.json": "6afc3f09b6616f799d739b5b114c4436059dcc60308af55fe96a8594de815214",
|
||||
"data/minecraft/worldgen/noise/spaghetti_roughness_modulator.json": "7f137a0382721b8c7b3227e65dc32a3f6d9c3d5893458b03e892797ae31d85d7",
|
||||
"data/minecraft/worldgen/noise/sulfur_cave_gradient.json": "4900ffd885ce33b220a673ba0a248504c78f9f2cdfce824106a237d9ad18a6a7",
|
||||
"data/minecraft/worldgen/noise/surface.json": "79365a5c2017e93878d989a176520ba9cbdf8685cff8b3cb148730d949d98b09",
|
||||
"data/minecraft/worldgen/noise/surface_secondary.json": "ae23cb210db7b64b66b327dbbf1e7b2acb5c15cb6fe5df0455eb29910d9312eb",
|
||||
"data/minecraft/worldgen/noise/surface_swamp.json": "19e08e0d1dff257cf748d3cef79e939e8f25cc5e7226653c789008171f40695b",
|
||||
"data/minecraft/worldgen/noise/temperature.json": "9b1d5a87d575abf2891882ec3e1544b964cd15fedc84ad14d2abbd3b48ee2e4b",
|
||||
"data/minecraft/worldgen/noise/temperature_large.json": "4fe64b952b751eb7e45b4d1e274add508b504ee8bbc54cad417ce3a3b068d42e",
|
||||
"data/minecraft/worldgen/noise/vegetation.json": "ff4c10776eb2822f9f66dec4e9878a1bc797aca711480bf8430f851ff9af77dc",
|
||||
"data/minecraft/worldgen/noise/vegetation_large.json": "20f4a255e3f9452f4cf983b3efed71ead184d04f4070283f355ad4d97993d133"
|
||||
},
|
||||
"density_resources_sha256": {
|
||||
"data/minecraft/worldgen/density_function/end/base_3d_noise.json": "38db7d590abc3144e3357a79562d649d9880bc2c62ddc99480d93f4b6401c9a6",
|
||||
"data/minecraft/worldgen/density_function/end/islands.json": "6e4f02929580ecc34bfb059855b4e88d080dc7ca6c9984f216bdaa32e6b47700",
|
||||
"data/minecraft/worldgen/density_function/end/sloped_cheese.json": "5dee072865321e57e5e231e60a57bfcd1919454f93da33b3c1651b3712f2cfb2",
|
||||
"data/minecraft/worldgen/density_function/nether/base_3d_noise.json": "76cfd16e6fc2b1ce8bdb5f5ee277d431c167bc01afc2462bffff09eb5f0bd582",
|
||||
"data/minecraft/worldgen/density_function/overworld/base_3d_noise.json": "2791a1e6c5c730eac1bd35aaea9a7ab22855872fdb92349192d045330fd4614f",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/entrances.json": "63a1b8351e6dea212501c36f515f32e5a0e960228b5b5ccf0dc5b43855cbc1ab",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/noodle.json": "3bce7453470fd37e3bfc11dc8584494aab094f9fd820038dc5592cb47e825a69",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/pillars.json": "069d35fbdaed7d74521fc3e9355a94e778450b52a05f1efbd470ce3917b8a207",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/spaghetti_2d.json": "a99c68ac415596788c84e93e81c96c9786e31db21a81157459a13272cda4cb1f",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/spaghetti_2d_thickness_modulator.json": "4f987a0b9e8c0adb02df47034fa8b3cebfbfb2c8e607123614ef009a16bfaf6c",
|
||||
"data/minecraft/worldgen/density_function/overworld/caves/spaghetti_roughness_function.json": "03bd1b405e53aeb75b6a3440d97975c25b6f11c7fc07149471b86c80fbdb6ea4",
|
||||
"data/minecraft/worldgen/density_function/overworld/chunk_surface_level.json": "93a4e26ce4a1144c42040f52ca375f0dec94648c70ccdcc52db4a7f55ca526a5",
|
||||
"data/minecraft/worldgen/density_function/overworld/continents.json": "0f2ff487c0556391ae2d56b7cab6990d45766ade2503236fe2669f83a64517be",
|
||||
"data/minecraft/worldgen/density_function/overworld/depth.json": "9fcd7c8badcae4dc8e86303b0f72b05b5fd998d5bb7ac637729dd7e688688069",
|
||||
"data/minecraft/worldgen/density_function/overworld/erosion.json": "8173a3df61a3c5cfe352fb4a8fa64e99840836e42f2f4b0ddf8035f4d28f97a5",
|
||||
"data/minecraft/worldgen/density_function/overworld/factor.json": "f7cd1629f1a034504bd74fd38af5ea75a59257c565b5d919a6212e2e08778e30",
|
||||
"data/minecraft/worldgen/density_function/overworld/final_density.json": "a7e6b9f4618e27cb08ec37a294d8ca2a96747128a8d65d788dc418fda372cfb1",
|
||||
"data/minecraft/worldgen/density_function/overworld/jaggedness.json": "5e8acc680409ae0b56596be02954eb5b49a72069d004e5dcf9a92c5e106ccdb2",
|
||||
"data/minecraft/worldgen/density_function/overworld/offset.json": "da6b4e686d8eb16c19443a1126168b6f2719712c02b690b9d7384ce53badf995",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/copper_density.json": "3b16d3a4499981f40bfd2b33786a99046bbca0c958f8f41692ffcbf44ae927d7",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/gap.json": "89ccfa58c6b8ae3e3954d2ff2dbcc42a8a3ae24a7b07437dbfb85fdced55945a",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/iron_density.json": "8de70a31c97e2a8299679770d53c8e366ace1aa8585e8d840375d25f85b72f8f",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/mask.json": "7f92df0b19e7d29fef01abc7025fea2bdae7a57453e186785cde2fc7d08aa5bc",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/richness.json": "3eb0183e295a5f9c54aab936b706b4b9d570ddf56c983ae89b91151e6e38fb9d",
|
||||
"data/minecraft/worldgen/density_function/overworld/ore_vein/toggle.json": "49b9db48740578911d0f8a2de40f02eced3ae742f03ebb05fee381af579cc9ed",
|
||||
"data/minecraft/worldgen/density_function/overworld/preliminary_surface_level.json": "4b6ce4c38ede0bec7485d4c029b9fcc7ceb5b26977c2c391a650fe8f3a3272b6",
|
||||
"data/minecraft/worldgen/density_function/overworld/ridges.json": "bf66a03bd8474d09dad4da23f4b7e76816b83e23df9f53d9c0b7c529c25ed9c1",
|
||||
"data/minecraft/worldgen/density_function/overworld/ridges_folded.json": "c8a4343b56273a476648a84fbbe07d8c473c1dd3769749260db6340ba5b37f9a",
|
||||
"data/minecraft/worldgen/density_function/overworld/sloped_cheese.json": "5e2e7756881a4f2acf2e8c8dc826a04681939ff1dc7508ce868e865e92a069d7",
|
||||
"data/minecraft/worldgen/density_function/overworld/temperature.json": "3c2f498cbf4636cd1fa7f555c14220a733c9d07fb5a1563f11c6144a27f31ce8",
|
||||
"data/minecraft/worldgen/density_function/overworld/vegetation.json": "c902ef045f63a568ef4c3d834716c67b5835f0994997ee45756837de111a806c",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/chunk_surface_level.json": "378eef8542e7ee3adffeaf746e0c776d1e00ff75cf030d9244292acd796739f6",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/depth.json": "35bbe18bc8eaec3bc8d81f1b3130018874d6cc8fa516c1e8380bdb8caf68c803",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/factor.json": "b42bc13d4d3c1cbeb7c6dfa2e16f4ef532ad0cff3a92d20bace01711fee6edd4",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/final_density.json": "cde96d8a5efa63cd20cea615dd1172e5e6f2626e9275d359fa2864e77083ac4f",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/jaggedness.json": "9f9a8993ce50cd2f0736ef98c3f8ff55db02d47b2a3e4f6aacae7c45a3c95bcc",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/offset.json": "0bb9ae6088ea4dbfdf79f6f2b2eed789c68e9a4e919a31bf912f91ddeda28e8b",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/preliminary_surface_level.json": "e8a82a9dfe183f4e624ea7a268efa2c54376caf99139596a26ad1dd27e887e5f",
|
||||
"data/minecraft/worldgen/density_function/overworld_amplified/sloped_cheese.json": "d8609154b76d0eefcfbc3746fa84f32cb04c5817a2fd1b80e72ee0ae9d88e96c",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/chunk_surface_level.json": "72f29b5fa9c01afa296d3679e6be662ee1b0bfdc1ba40cc2092ea74380be5c47",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/continents.json": "cfab013269cff17cfdf95497f87e70591378e7a39da44a241199fb64b304d411",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/depth.json": "9ec8ced85b58494f5400d4a5f6a27f1d4d44271d7a87adb8c5d842319eb5997f",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/erosion.json": "773d626db8e356d92a321270895ce085287d2befcb4504842371c38fd10102ac",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/factor.json": "0e7aa57eca20ebd6d2f089a9a4a34502efe902295812650f71b2ff087bb8b15f",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/final_density.json": "6f644644293c5489c499dc57663f2c12de60fc720bc4f1120efd343246eb159e",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/jaggedness.json": "30090703d4d9e493d40d60e06ee12f1310a608e20b73aeb8f86efa8e31b11453",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/offset.json": "75517306420732023e2dfeeb253439d8f0edcde9bb8b10ee7870d1bdb072ec22",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/preliminary_surface_level.json": "ece7767faac91980f5349ddfdc6040dc4ebbfce71a9f4d5842fa1b7bb169db3b",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/sloped_cheese.json": "347e160b5f951137b5f82a39c18572f8851c5a22484d11f31d1f90f5e5f6ac99",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/temperature.json": "051138f2c2f0ca4050b92f7320ddea461dca2038a49eb6f9931ecbf39129f4ef",
|
||||
"data/minecraft/worldgen/density_function/overworld_large_biomes/vegetation.json": "187b08814a3831cd0ff2f405c6683e7213a79dc7eeec44cd46136e350b0718b7",
|
||||
"data/minecraft/worldgen/density_function/shift_x.json": "0db6e5f781089feede9d8d2936d7564024752e34006b8bc9f2a138749f91e3e7",
|
||||
"data/minecraft/worldgen/density_function/shift_z.json": "0b561cdfafa9e82f431a8051576eb2ddc386d01459df571d7040021b0debb762",
|
||||
"data/minecraft/worldgen/density_function/y.json": "e7766e59792605f5c3d8e05ff6263db1dc6c91343c736b3ab7a58ddee9771282",
|
||||
"data/minecraft/worldgen/density_function/zero.json": "8aed642bf5118b9d3c859bd4be35ecac75b6e873cce34e7b6f554b06f75550d7"
|
||||
},
|
||||
"noise_settings_resources_sha256": {
|
||||
"data/minecraft/worldgen/noise_settings/amplified.json": "07fbadd0fd71e16e5497c575d3c86d997166087ccfaaba70a589a440b915024e",
|
||||
"data/minecraft/worldgen/noise_settings/caves.json": "29a378b845f7bff27a8badecba7ecf2bb22d0d4224b751ab6d91677c83bc6a6a",
|
||||
"data/minecraft/worldgen/noise_settings/end.json": "d0fd92ddd39081f1779ce5482041a837fb4a03841ea4d843556f17b557e31f4b",
|
||||
"data/minecraft/worldgen/noise_settings/floating_islands.json": "54923e55bfad4274bea513eccb42e1eb3625fb47ae00905537e0d3d68f82045d",
|
||||
"data/minecraft/worldgen/noise_settings/large_biomes.json": "dcb29a9e3fb630f2b76a52d759c6925b40e67cd13bc7f9ae93976f0633cc2c05",
|
||||
"data/minecraft/worldgen/noise_settings/nether.json": "e6d7856fe4523e4c3fa4dce756b6b1e211bfc263c5e417fb6294d032b8f53e9b",
|
||||
"data/minecraft/worldgen/noise_settings/overworld.json": "d093895d50edd79d53555b33b62d767115399764e32a4f9ae2687739f785d4b9"
|
||||
},
|
||||
"inputs_sha256": "4afb482c8aa6e654ef47b9696f76c16fa862414248202c9bf748941bfc8d0877",
|
||||
"rust_output_sha256": "c39201a8d64b2ec12dc08d8eddcb962d336885a749200a0a33c0fefd7910c193",
|
||||
"sources_sha256": {
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaWorldgenOracle.java": "272b7e7c90dfc1344f6964033b61ee27ac867da7b375e406586b88de08d02b08",
|
||||
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBiomeExport.java": "f9a773713cf21b69bfa10018b76f27b953bda140ede9934f43d3aa3091101cf5",
|
||||
"tools/test_worldgen_parity.py": "699826ef3d3f1ac5419b91153539bf0857e931fd128a39fc47d8c8071cc03268",
|
||||
"tools/test_rust_parity.py": "7efa699a38c5820424f5fc8992ee601dbfe26d6482da9d2dab2c17c41fe8f12a",
|
||||
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
|
||||
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
|
||||
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
|
||||
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
|
||||
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
|
||||
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
|
||||
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
|
||||
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
|
||||
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
|
||||
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
|
||||
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
|
||||
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
|
||||
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
|
||||
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
|
||||
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
|
||||
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
|
||||
"crates/horizon-core/src/density/mod.rs": "69f89566a78456c29caaa39dacedfe711ca59e49b78f64e68b0414fb6a73d8fc",
|
||||
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
|
||||
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
|
||||
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
|
||||
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
|
||||
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
|
||||
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
|
||||
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
|
||||
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
|
||||
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
|
||||
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
|
||||
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
|
||||
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
|
||||
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
|
||||
"crates/horizon-core/src/geometry/shape.rs": "de22acd7430df3f69ef3632d427c57dffe57f3bdb78950bc75eac7e179ccf9df",
|
||||
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
|
||||
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
|
||||
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
|
||||
"crates/horizon-core/src/lib.rs": "3968e2a337a6a23226c485057c79359e66df16683f00fb4ebc9fabb03910a015",
|
||||
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
|
||||
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
|
||||
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
|
||||
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
|
||||
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
|
||||
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
|
||||
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
|
||||
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
|
||||
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
|
||||
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
|
||||
"crates/horizon-core/src/random.rs": "92135a94c79111cc810b4b071dbd76043ee47c2585fd431e7486ea381f19e5db",
|
||||
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
|
||||
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
|
||||
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
|
||||
"crates/horizon-core/src/ticks/mod.rs": "84852599dde78687d782f115a5b4b3ef6856c1f9cc92917255167e89c72ab01e",
|
||||
"crates/horizon-core/tests/density_world_fields.rs": "e193e45080817ef92547828a8d106482a376b9f788e39d4d3831f44e9d693148",
|
||||
"crates/horizon-world/examples/collision_fixture.rs": "ee754b5b42e0a51fe0a305b3f4bb56522ff3fffae564180aab8087b1b9e44afc",
|
||||
"crates/horizon-world/examples/tick_fixture.rs": "df267c307e0491a238b2d93edf0384514f38f8ee3252e315b989de56c6e17990",
|
||||
"crates/horizon-world/examples/world_fixture.rs": "a3c4c0f5131ae051b24662eff0ed11ed797c6fd5069fbfdf819f0e3fcdfb2cf4",
|
||||
"crates/horizon-world/src/bin/worldgen_parity.rs": "5af97baa6681bc7aa04d981ec5c07c38cb27f28213abf34b1e83270828dd2980",
|
||||
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
|
||||
"crates/horizon-world/src/collision.rs": "6c40ab491efd0332bd4e65a1a112f3598f9eb0ea2f32f9c8cc7e81278d003251",
|
||||
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
|
||||
"crates/horizon-world/src/lib.rs": "a6376d79c90ebdee539f4b460a9dd18d75e0c049c24f028d00c9c45c85ebf668",
|
||||
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
|
||||
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
|
||||
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
|
||||
"crates/horizon-world/src/registry.rs": "f46065659e60eb5e84ad69b9f3b5e94dc87ee19de16408817e26f23d16b6c7e7",
|
||||
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
|
||||
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
|
||||
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
|
||||
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
|
||||
"crates/horizon-world/src/worldgen/biome.rs": "b3b73091aa5ec989d916206567c5e4b0e997b007a5bb9c0ca5c53ada9d5fe81f",
|
||||
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
|
||||
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
|
||||
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
|
||||
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
|
||||
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
|
||||
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
|
||||
"crates/horizon-world/src/worldgen.rs": "24f440a4be7546e79b4f462dd18aad9031e94dc87c5f1d32b78912650f7dd162",
|
||||
"crates/horizon-world/tests/biome_data.rs": "d4de462ccc3e6ad5760490330e0f0cd8a45734077708a2eca95ca06e65f779b0",
|
||||
"crates/horizon-world/tests/collision_data.rs": "45f3d33b36efe720e99ebf75b9f4fbddd777cebea4618bba245ca106b3443391",
|
||||
"crates/horizon-world/tests/tick_data.rs": "ab345209367db6963b987797992c4a06433bd2039e6021bd834f6305324c04d7",
|
||||
"crates/horizon-world/tests/world_io.rs": "4a42630c99ce89b27cc2be1a1b961ad880f62762ab661f9e92ef9bcf7f3e76e0",
|
||||
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
|
||||
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
|
||||
"Cargo.toml": "dc370d5fdde37238c3e4820046f11c3201020406a4edfa1308257c13edbdcda4",
|
||||
"Cargo.lock": "7307d0c887364db36d327685ecf0671b75305e31e5ba5fbdcdbb15eaf156d20e"
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"side": "client",
|
||||
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
|
||||
"output_sha256": "c39201a8d64b2ec12dc08d8eddcb962d336885a749200a0a33c0fefd7910c193",
|
||||
"matched_output_lines": 922238,
|
||||
"biome_export_sha256": "b03e2fbe85c191a22f333bc989bd2a73c66f0f9fbcd9ddb54774f17c247832e9"
|
||||
},
|
||||
{
|
||||
"side": "server",
|
||||
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
|
||||
"output_sha256": "c39201a8d64b2ec12dc08d8eddcb962d336885a749200a0a33c0fefd7910c193",
|
||||
"matched_output_lines": 922238,
|
||||
"biome_export_sha256": "b03e2fbe85c191a22f333bc989bd2a73c66f0f9fbcd9ddb54774f17c247832e9"
|
||||
}
|
||||
],
|
||||
"scope": "Direct normal-noise JSON decoding using the actual pinned vanilla CODEC. Every bundled noise registry resource, explicit/default parameters, empty and full amplitude modifiers, normalization modes, inclusive field bounds with signed-zero comparator ordering, malformed types, null fields, duplicate and ignored keys, decimal/exponent integer truncation and wrapping, signed zero, seeded modern/legacy and Nether construction, octave metadata, range and normalization bits, scalar noise values and parent random state. JSON resource contents stay private. Strict JSON parsing; no claim for Gson's permissive non-JSON syntax. Bundled density registries are also decoded with actual vanilla registry-aware CODECs: named forward references, all bundled function kinds, declared range/axes, raw compilation errors, seeded optimized roots, cache allocation, scalar values, strided bulk values, repeated cache hits and surface-volume errors are compared using RandomState's actual compile context. All seven bundled noise-setting resources contribute their actual eight-field NoiseRouter.CODEC objects to RandomState. Router fields are compiled in declaration order with a shared compiler/context; cache allocation, raw/optimized scalar and repeated strided volume values, successful single-layer surface volumes and invalid surface-volume shapes are compared. Actual RandomState climate sampler binding and quart-to-block coordinate wrapping are checked at ordinary and extreme positions. Float-to-long climate quantization and long-to-float conversion include subnormals, signed zeros, NaNs, infinities, cast saturation and seeded random bit patterns. Actual vanilla Climate.Parameter and ParameterPoint JSON codecs compare scalar, two-element list and min/max object intervals, float endpoint bounds/ordering, required coordinate/offset fields, negative zero, precision-sensitive float parsing, malformed types and duplicate keys. Climate parameter distances, wrapping squared fitness, stable search-tree leaf order and nearest lookup are compared across every supported branching value 2..32, sizes around branch powers, the 65536-entry API bound, duplicates, warm ties, fresh lookups, brute-force lookup and extreme signed-long endpoints/targets. The Rust tree is immutable with per-worker search state instead of hidden thread locals; invalid or degenerate searches return typed errors. Inline arbitrary distance metrics and behavior outside the bounded API are not covered. Built-in Overworld and Nether quantized biome parameter tables are exported independently by each authenticated JAR and required to agree before Rust consumes them. The Rust multi-noise resolver and actual vanilla MultiNoiseBiomeSource compare biome identities through scalar climate queries and prepared bulk quart volumes, including forward/reverse/repeated query order, wrapped extreme origins and shared previous-result state. Biome holder keys in the reference are registration placeholders; no biome property or gameplay behavior is evaluated. The Rust loader reads a Horizon quantized table format, not the vanilla biome codec, and the preset builders themselves have not been ported. Source and private fixture mutations during validation invalidate the report. The two-field 26.3 NoiseSettings codec, create helper and LevelHeightAccessor clamping are also compared across bundled noise members, dimension/alignment bounds, zero/negative runtime heights, disjoint ranges, wrapped integer arithmetic and decimal/exponent integer conversion. Global fluid cutoff selection and the actual disabled Aquifer implementation are compared with original default block-state identities, extreme sea levels/coordinates, signed-zero/subnormal/nonfinite density and counted picker calls; developer fluid-disable behavior is outside the regular-mode corpus. The actual noise-based Aquifer.Config codec and runtime are compared across bundled aquifer settings, modern/legacy world-seeded aquifer factories, synthetic density roots, nondefault water/lava states, cave/void air, nonfinite sampler overrides, strided volume extents, wrapped coordinates, repeated and reversed queries, counted picker calls, sampler call order/values, injected failures and retry state, scheduling flags, populated location/status caches and sorted surface-cache entries. Oversized or wrapped-invalid grid allocations and developer fluid-disable behavior are outside the bounded regular-mode API. Terrain filling is not yet validated. Router, vertical noise and optional aquifer members are decoded from each noise-setting resource; complete NoiseGeneratorSettings, material rules, nonempty world fields, biome registry/codecs and complete chunk biome assignment, generated chunks, gameplay and rendering remain pending. Inline noise holders and general codec behavior beyond the covered fixtures remain pending."
|
||||
}
|
||||
@@ -1,342 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"measurement": "Shader world activation/startup probes; not FPS or physical M2 measurements",
|
||||
"release": "0.20.0",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"local_source_commit": "99d6aae5e06a3fc9a9a69c433f48f32729776861",
|
||||
"linux_opengl": {
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"results": [
|
||||
{
|
||||
"observed_mode": "world",
|
||||
"title_screen_observed": false,
|
||||
"world_loaded": true,
|
||||
"ready_client_ticks": 40,
|
||||
"window_active": true,
|
||||
"overlay_present": false,
|
||||
"overlay_wait_ticks": 79,
|
||||
"heap_max_bytes": 6442450944,
|
||||
"iris_capture_status": "available",
|
||||
"iris_shaders_enabled": true,
|
||||
"shader_required": true,
|
||||
"iris_expected_pack_matches": true,
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 3777,
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.5 (Core Profile) Mesa 26.0.8-1ubuntu0.3",
|
||||
"private_png_sha256": "1a221bb9bedb21770f08ffcde593539c02d4e7cad48516bf7fad4215d7b14cde",
|
||||
"profile": "cinematic",
|
||||
"preferred_backend": "opengl",
|
||||
"launcher_exit_code": 0,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Short scene startup and nonuniform framebuffer readback only.",
|
||||
"World mode uses the ordinary limited demo; world files remain private.",
|
||||
"No exhaustive gameplay, visual-correctness, FPS or M2 Pro performance claim.",
|
||||
"Vulkan preference can fall back; inspect the observed backend.",
|
||||
"PNG images, assets and full logs remain in the private runtime directory."
|
||||
]
|
||||
},
|
||||
"linux_vulkan_failure": {
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.awt.AWTError",
|
||||
"java.lang.NullPointerException",
|
||||
"java.lang.RuntimeException",
|
||||
"net.minecraft.ReportedException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.4.335 llvmpipe Mesa 26.0.8-1ubuntu0.3 (LLVM 21.1.8)"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": false,
|
||||
"readback_callback_received": false,
|
||||
"readback_inspections": [],
|
||||
"probe_failure_categories": [],
|
||||
"vulkan_error_codes": [],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.renderer.Lightmap.handler$zzk000$distanthorizons$render",
|
||||
"net.minecraft.client.renderer.Lightmap.render",
|
||||
"net.minecraft.client.renderer.GameRenderer.render"
|
||||
],
|
||||
"profile": "cinematic",
|
||||
"preferred_backend": "vulkan"
|
||||
},
|
||||
"linux_vulkan_without_dh": {
|
||||
"private_dh_jar_removed": true,
|
||||
"new_demo_world": true,
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"original_mod_sha256": "e651ef49bc97486e8dacfd4b640465c442525cd645e2dba71ddea9fb64347dd8",
|
||||
"failure": {
|
||||
"exit_code": 1,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.AssertionError",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "llvmpipe (LLVM 21.1.8, 256 bits)",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.4.335 llvmpipe Mesa 26.0.8-1ubuntu0.3 (LLVM 21.1.8)"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": true,
|
||||
"readback_callback_received": true,
|
||||
"readback_inspections": [
|
||||
{
|
||||
"framebuffer_width": 1280,
|
||||
"framebuffer_height": 800,
|
||||
"sampled_pixels": 4288,
|
||||
"distinct_sampled_rgb": 1804
|
||||
}
|
||||
],
|
||||
"probe_failure_categories": [
|
||||
"shader_inactive"
|
||||
],
|
||||
"vulkan_error_codes": [],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.Screenshot.lambda$takeScreenshot$1",
|
||||
"com.mojang.renderpearl.backend.vulkan.DestructionQueue.rotate",
|
||||
"com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder.submit",
|
||||
"com.mojang.renderpearl.frontend.FrontendCommandEncoder.submit"
|
||||
]
|
||||
}
|
||||
},
|
||||
"mac_source_commit": "857c5a4aa553f83799631ad48340e43a13c78549",
|
||||
"mac_run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37198566508",
|
||||
"mac_cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"cinematic",
|
||||
"--backend",
|
||||
"opengl",
|
||||
"--world",
|
||||
"--shaders"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"fixture": "client-graphics",
|
||||
"profile": "cinematic",
|
||||
"completed": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"cinematic",
|
||||
"--backend",
|
||||
"vulkan",
|
||||
"--world",
|
||||
"--shaders"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"fixture": "client-graphics",
|
||||
"profile": "cinematic",
|
||||
"completed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Linux llvmpipe software renderer; no physical M2 shader performance or native GPU test.",
|
||||
"OpenGL requires actual pinned shader activation and matching runtime pack identity, with nonuniform readback, focused gameplay, saved data and clean exit.",
|
||||
"Linux Vulkan plus DH fails before readback; selected stack locations alone do not establish the root cause.",
|
||||
"Removing DH privately produces an ordinary Vulkan world readback but Iris reports shaders inactive; the required-activation assertion rejects it.",
|
||||
"Both hosted Mac cases hit the 240-second private fixture timeout; earlier diagnostics do not retain stages or waiting state. They do not establish shader compatibility or incompatibility.",
|
||||
"Full logs, raw PNGs, world data, assets and shader ZIPs remain private.",
|
||||
"Diagnostic repeat: OpenGL loads a world but retains a screen before readback; Vulkan initializes its device but records no waiting-state snapshot. Both time out; screen identity and root causes are unknown."
|
||||
],
|
||||
"mac_diagnostic_repeat": {
|
||||
"source_commit": "ed416c91cf980f136b7431314bccea7f266fe049",
|
||||
"run_url": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37199837867",
|
||||
"cases": [
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"cinematic",
|
||||
"--backend",
|
||||
"opengl",
|
||||
"--world",
|
||||
"--shaders"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": -15,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.IllegalStateException",
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "OpenGL",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Software Renderer",
|
||||
"graphics_backend": "OpenGL",
|
||||
"graphics_driver": "4.1 APPLE-23.1.1"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": false,
|
||||
"readback_callback_received": false,
|
||||
"readback_inspections": [],
|
||||
"last_waiting_state": {
|
||||
"world_loaded": true,
|
||||
"player_present": true,
|
||||
"overlay_present": false,
|
||||
"screen_present": true,
|
||||
"window_active": true,
|
||||
"paused": false,
|
||||
"ready_client_ticks": 0
|
||||
},
|
||||
"probe_failure_categories": [],
|
||||
"vulkan_error_codes": [],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [
|
||||
"net.minecraft.client.renderer.LevelRenderer.mixinextras$bridge$renderGroup$135",
|
||||
"net.minecraft.client.renderer.LevelRenderer.wrapOperation$bio000$iris$beginTerrainLayer",
|
||||
"net.minecraft.client.renderer.LevelRenderer.executeSolid",
|
||||
"net.minecraft.client.renderer.LevelRenderer.lambda$addMainPass$0",
|
||||
"com.mojang.blaze3d.framegraph.FrameGraphBuilder.execute",
|
||||
"net.minecraft.client.renderer.LevelRenderer.render",
|
||||
"net.minecraft.client.renderer.GameRenderer.mixinextras$bridge$render$86",
|
||||
"net.minecraft.client.renderer.GameRenderer.wrapOperation$bjf000$iris$renderLevel"
|
||||
],
|
||||
"fixture": "client-graphics",
|
||||
"profile": "cinematic",
|
||||
"completed": false,
|
||||
"timed_out": true,
|
||||
"timeout_seconds": 240
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": [
|
||||
"--profile",
|
||||
"cinematic",
|
||||
"--backend",
|
||||
"vulkan",
|
||||
"--world",
|
||||
"--shaders"
|
||||
],
|
||||
"exit_code": 1,
|
||||
"failure": [
|
||||
{
|
||||
"exit_code": -15,
|
||||
"result_count": 0,
|
||||
"java_exception_types": [
|
||||
"java.lang.RuntimeException"
|
||||
],
|
||||
"expected_demo_authentication_errors_observed": true,
|
||||
"backend_attempts": [
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "load_library",
|
||||
"result": "success"
|
||||
},
|
||||
{
|
||||
"backend": "Vulkan",
|
||||
"operation": "create_device",
|
||||
"result": "success"
|
||||
}
|
||||
],
|
||||
"created_devices": [
|
||||
{
|
||||
"gpu": "Apple Paravirtual device",
|
||||
"graphics_backend": "Vulkan",
|
||||
"graphics_driver": "1.2.350 MoltenVK 1.4.2"
|
||||
}
|
||||
],
|
||||
"client_initializer_reached": true,
|
||||
"readback_requested": false,
|
||||
"readback_callback_received": false,
|
||||
"readback_inspections": [],
|
||||
"last_waiting_state": null,
|
||||
"probe_failure_categories": [],
|
||||
"vulkan_error_codes": [],
|
||||
"fatal_jvm_error": false,
|
||||
"observed_graphics_stack_methods": [],
|
||||
"fixture": "client-graphics",
|
||||
"profile": "cinematic",
|
||||
"completed": false,
|
||||
"timed_out": true,
|
||||
"timeout_seconds": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,160 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"purpose": "Functional software identity capture, not a performance comparison",
|
||||
"minecraft": "26.3",
|
||||
"platform": "Linux x86_64 software OpenGL",
|
||||
"source_commit": "110c75d712ed4827ae5e72c613f834bcc4e97da2",
|
||||
"original_mod_sha256": "98f8db7ca8962a71625eef835f57d25c8afb802f2cf1b7c4c832fc070757e011",
|
||||
"results": [
|
||||
{
|
||||
"kind": "frames",
|
||||
"elapsed_seconds": 15.335704769,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_vm_name": "OpenJDK 64-Bit Server VM",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"mods": [
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+38c7a2d55d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+26.3",
|
||||
"[email protected]+74ed1ea502",
|
||||
"[email protected]+0ae6f91102",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+4be74c3f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+6b5b47fd5d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+427eab975d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+47f74c9802",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+cf6bc2db5d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+ffef5f6702",
|
||||
"[email protected]+4068fd645d",
|
||||
"[email protected]+ed66f0a35d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+79385d0b5d",
|
||||
"[email protected]+b9d63e335d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+901a437c02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+4fc5413f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+48607d035d",
|
||||
"[email protected]+74ed1ea502",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+52268a0e02",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+26.3",
|
||||
"java@25",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]"
|
||||
],
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"samples": 38,
|
||||
"csv_count_matched": true
|
||||
},
|
||||
{
|
||||
"kind": "ticks",
|
||||
"elapsed_seconds": 15.009787535,
|
||||
"java_vendor": "Ubuntu",
|
||||
"java_vm_name": "OpenJDK 64-Bit Server VM",
|
||||
"java_runtime_version": "25.0.4.1+1-1-26.04.4-Ubuntu",
|
||||
"mods": [
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+38c7a2d55d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+26.3",
|
||||
"[email protected]+74ed1ea502",
|
||||
"[email protected]+0ae6f91102",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+4be74c3f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+74ed1ea55d",
|
||||
"[email protected]+6b5b47fd5d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+427eab975d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+47f74c9802",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+cf6bc2db5d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+ffef5f6702",
|
||||
"[email protected]+4068fd645d",
|
||||
"[email protected]+ed66f0a35d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f5d",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+79385d0b5d",
|
||||
"[email protected]+b9d63e335d",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+901a437c02",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+4fc5413f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+48607d035d",
|
||||
"[email protected]+74ed1ea502",
|
||||
"[email protected]+3434d6d902",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+fcdff87f02",
|
||||
"[email protected]+52268a0e02",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+26.3",
|
||||
"java@25",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]",
|
||||
"[email protected]+mc26.3",
|
||||
"[email protected]",
|
||||
"[email protected]"
|
||||
],
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"samples": 301,
|
||||
"csv_count_matched": true
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual frame and integrated-server tick reports contain identical Java identity and 59 loaded mod versions, captured before each recording starts.",
|
||||
"The short 15-second recording validates metadata and file output only; it is not a valid performance comparison or a Mac result.",
|
||||
"The actual old/new report pair loads in the offline viewer with matching CSV timelines, an explicit Horizon mod-version difference and unknown legacy Java implementation warnings.",
|
||||
"Synthetic changed versions, reordered mod lists, missing legacy identity, escaped mod names and expanded lists at 390px pass offline checks."
|
||||
]
|
||||
}
|
||||
@@ -1,274 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"original_mod_sha256": "7e0ffb16fbda2117ce3cfe9fc6249ff3c06c63be764207963ba331871ed6fabd",
|
||||
"groups": [
|
||||
{
|
||||
"label": "initial",
|
||||
"initial_warmup_checks": 1000000,
|
||||
"per_observation_warmup_checks": 0,
|
||||
"observations": 1,
|
||||
"compiler_diagnostics": false,
|
||||
"compilation_waits": false,
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 120024838,
|
||||
"wall_ns": 161908976
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 2000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 225290712,
|
||||
"wall_ns": 296105327
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "compiler-diagnostic",
|
||||
"initial_warmup_checks": 1000000,
|
||||
"per_observation_warmup_checks": 4000000,
|
||||
"observations": 3,
|
||||
"compiler_diagnostics": true,
|
||||
"compilation_waits": false,
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 338028221,
|
||||
"wall_ns": 414836219,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 116948835,
|
||||
"wall_ns": 177862175,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 118223124,
|
||||
"wall_ns": 134092410,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 102856262,
|
||||
"wall_ns": 102881634,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 277210100,
|
||||
"wall_ns": 346114782,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 98829230,
|
||||
"wall_ns": 109874899,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 99766363,
|
||||
"wall_ns": 120221997,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 78614507,
|
||||
"wall_ns": 116017886,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "normal-early",
|
||||
"initial_warmup_checks": 1000000,
|
||||
"per_observation_warmup_checks": 4000000,
|
||||
"observations": 3,
|
||||
"compiler_diagnostics": false,
|
||||
"compilation_waits": false,
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 250273130,
|
||||
"wall_ns": 250904773,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 96863757,
|
||||
"wall_ns": 97499670,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 76736599,
|
||||
"wall_ns": 76731887,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 76672774,
|
||||
"wall_ns": 76673216,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 260828228,
|
||||
"wall_ns": 292619474,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 100375163,
|
||||
"wall_ns": 120697389,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 97211084,
|
||||
"wall_ns": 108680199,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 63241981,
|
||||
"wall_ns": 63241886,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "normal-long-warmup",
|
||||
"initial_warmup_checks": 10000000,
|
||||
"per_observation_warmup_checks": 4000000,
|
||||
"observations": 3,
|
||||
"compiler_diagnostics": false,
|
||||
"compilation_waits": true,
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 331478729,
|
||||
"wall_ns": 331596880,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 111403835,
|
||||
"wall_ns": 111532068,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 108573471,
|
||||
"wall_ns": 108571667,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 111501423,
|
||||
"wall_ns": 111493145,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 260347437,
|
||||
"wall_ns": 260362090,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 74253874,
|
||||
"wall_ns": 74284701,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 96313457,
|
||||
"wall_ns": 96305444,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 89780106,
|
||||
"wall_ns": 89771945,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Exploratory fixed-order single forks. Earlier fixture protocols were not committed; warmup and diagnostics differ between groups.",
|
||||
"Current production arithmetic is the same binary in all groups. Only the final protocol is reproducible from source commit c6ec0b5.",
|
||||
"Retains favorable and unfavorable observations; do not combine different protocols into a statistical speedup estimate.",
|
||||
"Not game FPS/RAM, Mac GPU, retained-memory or cross-hardware performance evidence."
|
||||
]
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "7e0ffb16fbda2117ce3cfe9fc6249ff3c06c63be764207963ba331871ed6fabd",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 164904484,
|
||||
"wall_ns": 164901169,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 59683623,
|
||||
"wall_ns": 59686627,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 52733305,
|
||||
"wall_ns": 52727455,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 52487556,
|
||||
"wall_ns": 52487087,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 151660192,
|
||||
"wall_ns": 151647654,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 56070222,
|
||||
"wall_ns": 56068070,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 47850398,
|
||||
"wall_ns": 47843978,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 47739572,
|
||||
"wall_ns": 47735606,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual public full-data lookup inside Fabric with generated numeric column data.",
|
||||
"Thirty owners span positive/negative origins and six detail levels; output digests and source fingerprints match.",
|
||||
"The actual redirect method is checked in each mode; source column data remains unchanged.",
|
||||
"Three sequential warmed caller-loop observations are not independent forks; JIT compilation can vary.",
|
||||
"Not whole-game FPS/RAM, rendered-pixel equivalence or a Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "c6ec0b5e14d2ea3546fb8858be4a655634a93387",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37171062262",
|
||||
"job": "portable-mod (ubuntu-latest)",
|
||||
"artifact": "horizon-ubuntu-latest",
|
||||
"command": "python tools/test_terrain_position.py"
|
||||
}
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "7e0ffb16fbda2117ce3cfe9fc6249ff3c06c63be764207963ba331871ed6fabd",
|
||||
"platform": "Linux x86_64",
|
||||
"graphics": "llvmpipe software OpenGL",
|
||||
"settings": {
|
||||
"heap_bytes": 3221225472,
|
||||
"gc": "G1",
|
||||
"compact_headers": true,
|
||||
"render_distance": 12,
|
||||
"simulation_distance": 12,
|
||||
"lod_radius_chunks": 128,
|
||||
"lod_quality": "MEDIUM/MEDIUM/BLOCK",
|
||||
"terrain_workers": 2,
|
||||
"runtime_ratio": 0.5,
|
||||
"world_difficulty": "PEACEFUL"
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"profile": "m2-balanced",
|
||||
"position_enabled": false,
|
||||
"elapsed_seconds": 120.557552272,
|
||||
"frame_samples": 221,
|
||||
"tick_samples": 2401,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 221,
|
||||
"meanMs": 539.3068458597285,
|
||||
"p50Ms": 512.140615,
|
||||
"p95Ms": 731.515105,
|
||||
"p99Ms": 811.750394,
|
||||
"maxMs": 995.181191,
|
||||
"meanRate": 1.8542319788391781,
|
||||
"lowOnePercentRate": 1.1163478251626853,
|
||||
"over16Ms": 221,
|
||||
"over33Ms": 221,
|
||||
"over50Ms": 221,
|
||||
"over100Ms": 221
|
||||
},
|
||||
"tick_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 9.190547997917534,
|
||||
"p50Ms": 8.84372,
|
||||
"p95Ms": 16.100883,
|
||||
"p99Ms": 21.297713,
|
||||
"maxMs": 50.24744,
|
||||
"meanRate": 108.8074400162632,
|
||||
"lowOnePercentRate": 34.084420672139515,
|
||||
"over16Ms": 99,
|
||||
"over33Ms": 6,
|
||||
"over50Ms": 1,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_rss_peak_sampled_bytes": 2961256448,
|
||||
"launcher_exit_code": 0
|
||||
},
|
||||
{
|
||||
"profile": "terrain-position",
|
||||
"position_enabled": true,
|
||||
"elapsed_seconds": 120.41545128,
|
||||
"frame_samples": 219,
|
||||
"tick_samples": 2401,
|
||||
"excluded_frames": 0,
|
||||
"dropped_samples": 0,
|
||||
"visual_settings_changed": [],
|
||||
"frame_stats": {
|
||||
"count": 219,
|
||||
"meanMs": 543.8858950547946,
|
||||
"p50Ms": 511.34048,
|
||||
"p95Ms": 780.127415,
|
||||
"p99Ms": 989.910492,
|
||||
"maxMs": 1062.14914,
|
||||
"meanRate": 1.8386209480561242,
|
||||
"lowOnePercentRate": 0.9801615082035254,
|
||||
"over16Ms": 219,
|
||||
"over33Ms": 219,
|
||||
"over50Ms": 219,
|
||||
"over100Ms": 219
|
||||
},
|
||||
"tick_stats": {
|
||||
"count": 2401,
|
||||
"meanMs": 9.594661623490213,
|
||||
"p50Ms": 9.152511,
|
||||
"p95Ms": 17.227297,
|
||||
"p99Ms": 25.78339,
|
||||
"maxMs": 56.681493,
|
||||
"meanRate": 104.22462398796237,
|
||||
"lowOnePercentRate": 30.354925598948153,
|
||||
"over16Ms": 143,
|
||||
"over33Ms": 9,
|
||||
"over50Ms": 1,
|
||||
"over100Ms": 0
|
||||
},
|
||||
"process_rss_peak_sampled_bytes": 2989678592,
|
||||
"launcher_exit_code": 0
|
||||
}
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "c6ec0b5e14d2ea3546fb8858be4a655634a93387",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37171062262",
|
||||
"runtime_mod_matches_linux_ci": true,
|
||||
"initial_player_snapshot_sha256": "b4d11dbd6443625415a1e32aa242d0e2d09cd77ddb1becfde5d35cb6ab8d278a",
|
||||
"initial_level_snapshot_sha256": "86a3c75ea993e50c4428da4dbadc5856688a9367f035c41b8bb49863a9aeb644",
|
||||
"first_saved_player_position": [
|
||||
-56.5,
|
||||
69.0,
|
||||
55.5
|
||||
],
|
||||
"first_saved_player_rotation": [
|
||||
141.5,
|
||||
16.950002670288086
|
||||
]
|
||||
},
|
||||
"notes": [
|
||||
"Fixed-order candidate then control single pair, separate copies of the same private world; approximately 307 seconds from demo-popup dismissal to capture for each. Initial player camera and both first saved camera positions matched.",
|
||||
"Stationary view includes LOD terrain; both recordings have zero paused/unfocused exclusions and matching captured settings apart from the isolated hook. No statistical speed estimate is established.",
|
||||
"Preceding 60-second JFR captures ran separately before the frame recording; JIT/cache/profiling effects are not eliminated.",
|
||||
"Candidate saved, reloaded, saved again and quit; control saved and quit. Both foreground launchers returned 0, with no crash reports or remaining game processes.",
|
||||
"Scene differs from earlier release captures, so comparisons across releases are not valid. Private test-world camera preparation is not included in the mod or release packs.",
|
||||
"No FPS improvement is established. Software rendering dominates this machine; these are functional observations, not Mac, GPU or unified-memory performance results. RSS is process resident memory, not complete GPU/unified RAM."
|
||||
]
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "7e0ffb16fbda2117ce3cfe9fc6249ff3c06c63be764207963ba331871ed6fabd",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 331478729,
|
||||
"wall_ns": 331596880,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 111403835,
|
||||
"wall_ns": 111532068,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 108573471,
|
||||
"wall_ns": 108571667,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 111501423,
|
||||
"wall_ns": 111493145,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_hook_checked": true,
|
||||
"owners": 30,
|
||||
"queries": 491520,
|
||||
"nonzero": 327049,
|
||||
"lookup_digest": "c9745cc2e7cf6c486a92f87635c87590db61127063970c8a8c7bfb2ef5282cca",
|
||||
"data_fingerprint": -5590987990034711991,
|
||||
"data_unchanged": true,
|
||||
"measured_checks": 6000000,
|
||||
"checksum": 274877907204874744,
|
||||
"allocated_bytes": 400,
|
||||
"cpu_ns": 260347437,
|
||||
"wall_ns": 260362090,
|
||||
"observations": [
|
||||
{
|
||||
"cpu_ns": 74253874,
|
||||
"wall_ns": 74284701,
|
||||
"allocated_bytes": 400
|
||||
},
|
||||
{
|
||||
"cpu_ns": 96313457,
|
||||
"wall_ns": 96305444,
|
||||
"allocated_bytes": 0
|
||||
},
|
||||
{
|
||||
"cpu_ns": 89780106,
|
||||
"wall_ns": 89771945,
|
||||
"allocated_bytes": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual public full-data lookup inside Fabric with generated numeric column data.",
|
||||
"Thirty owners span positive/negative origins and six detail levels; output digests and source fingerprints match.",
|
||||
"The actual redirect method is checked in each mode; source column data remains unchanged.",
|
||||
"Three sequential warmed caller-loop observations are not independent forks; JIT compilation can vary.",
|
||||
"Not whole-game FPS/RAM, rendered-pixel equivalence or a Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "c6ec0b5e14d2ea3546fb8858be4a655634a93387",
|
||||
"command": "python tools/test_terrain_position.py",
|
||||
"protocol": {
|
||||
"initial_warmup_checks": 10000000,
|
||||
"initial_compilation_wait_ms": 1000,
|
||||
"observation_count": 3,
|
||||
"per_observation_warmup_checks": 4000000,
|
||||
"per_observation_compilation_wait_ms": 200,
|
||||
"per_observation_measured_checks": 2000000,
|
||||
"run_order": [
|
||||
false,
|
||||
true
|
||||
],
|
||||
"compiler_diagnostics": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "c506982631880604513de8ef85e3b4461fbb898702e60b4a6f74ca3b3d4a687f",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_io_worker_checked": true,
|
||||
"ordinary_join_checked": true,
|
||||
"shared_future_preserved": true,
|
||||
"exception_identity_checked": true,
|
||||
"completed_interrupt_checked": true,
|
||||
"cancelled_completion_checked": true,
|
||||
"preinterrupted_pending_checked": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_io_worker_checked": true,
|
||||
"ordinary_join_checked": true,
|
||||
"shared_future_preserved": true,
|
||||
"exception_identity_checked": true,
|
||||
"completed_interrupt_checked": true,
|
||||
"cancelled_completion_checked": true,
|
||||
"preinterrupted_pending_checked": true
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual game IOWorker under Fabric, with controlled cached blending-read futures.",
|
||||
"DH worker interruption releases only its waiter; the shared future remains consumable.",
|
||||
"Ordinary callers retain join behavior; completed values, cancellation and exception identity are checked.",
|
||||
"This is a shutdown correctness fixture, not an FPS or world-generation throughput benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "9a1b22aa56f58a3ee39a3564be859a662d2beedc",
|
||||
"workflow_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37166150119",
|
||||
"job": "portable-mod (ubuntu-latest)",
|
||||
"artifact": "horizon-ubuntu-latest",
|
||||
"command": "python tools/test_terrain_read.py"
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"original_mod_sha256": "c506982631880604513de8ef85e3b4461fbb898702e60b4a6f74ca3b3d4a687f",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"applied_io_worker_checked": true,
|
||||
"ordinary_join_checked": true,
|
||||
"shared_future_preserved": true,
|
||||
"exception_identity_checked": true,
|
||||
"completed_interrupt_checked": true,
|
||||
"cancelled_completion_checked": true,
|
||||
"preinterrupted_pending_checked": true
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"applied_io_worker_checked": true,
|
||||
"ordinary_join_checked": true,
|
||||
"shared_future_preserved": true,
|
||||
"exception_identity_checked": true,
|
||||
"completed_interrupt_checked": true,
|
||||
"cancelled_completion_checked": true,
|
||||
"preinterrupted_pending_checked": true
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual game IOWorker under Fabric, with controlled cached blending-read futures.",
|
||||
"DH worker interruption releases only its waiter; the shared future remains consumable.",
|
||||
"Ordinary callers retain join behavior; completed values, cancellation and exception identity are checked.",
|
||||
"This is a shutdown correctness fixture, not an FPS or world-generation throughput benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "9a1b22aa56f58a3ee39a3564be859a662d2beedc",
|
||||
"environment": "local Linux x64 software graphics; actual Fabric fixture",
|
||||
"command": "python tools/test_terrain_read.py"
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"platform": "Linux-6.17.0-1022-azure-x86_64-with-glibc2.39",
|
||||
"architecture": "x86_64",
|
||||
"minecraft": "26.3",
|
||||
"distant_horizons": "3.3.4",
|
||||
"results": [
|
||||
{
|
||||
"enabled": false,
|
||||
"allocated_bytes": 245760208,
|
||||
"cpu_ns": 423649902,
|
||||
"wall_ns": 481491629,
|
||||
"nodes_per_tick": 512,
|
||||
"measured_ticks": 20000,
|
||||
"verified_transitions": 6000,
|
||||
"checksum": 10240000
|
||||
},
|
||||
{
|
||||
"enabled": true,
|
||||
"allocated_bytes": 208,
|
||||
"cpu_ns": 185922780,
|
||||
"wall_ns": 192151484,
|
||||
"nodes_per_tick": 512,
|
||||
"measured_ticks": 20000,
|
||||
"verified_transitions": 6000,
|
||||
"checksum": 10240000
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
"Actual publisher tick holder under Fabric, warmed with preallocated nodes and a reused action list.",
|
||||
"Checks duplicate/null membership, enable/disable precedence, published iteration order and clear boundaries.",
|
||||
"Only private membership checks change; action collections and traversal remain upstream.",
|
||||
"CPU and allocation measure the calling thread in one isolated loop; no statistical speed claim.",
|
||||
"Not a game FPS, visible terrain completion, whole-game RAM or Mac GPU benchmark."
|
||||
],
|
||||
"provenance": {
|
||||
"source_commit": "e091816ce06686d64d0f7a181a42701aa67e5bf7",
|
||||
"ci_run": "https://github.com/ludovic111/minecraft-optimization-lab/actions/runs/37162939262",
|
||||
"artifact": "horizon-ubuntu-latest"
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Darwin 25.6.0 arm64; logical CPUs 3
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.346; 1643.771 ms; worker allocation 1403064 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.514; 1061.526 ms; worker allocation 15456 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.466; 1238.603 ms; worker allocation 1449704 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.063; 11385.730 ms; worker allocation 204024 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.703; 785.293 ms; worker allocation 1417064 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.509; 1097.416 ms; worker allocation 14496 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.431; 1293.360 ms; worker allocation 1529184 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.065; 10727.658 ms; worker allocation 198104 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.620; 896.747 ms; worker allocation 1490864 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.518; 1062.565 ms; worker allocation 13096 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.605; 975.086 ms; worker allocation 1450064 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.060; 11976.557 ms; worker allocation 196840 bytes
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Linux 6.17.0-1022-azure x86_64; logical CPUs 4
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 1.000; 578.014 ms; worker allocation 1450616 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.525; 1041.454 ms; worker allocation 64976 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.976; 591.683 ms; worker allocation 1451744 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.076; 10349.493 ms; worker allocation 145264 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 1.000; 577.632 ms; worker allocation 1451096 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.523; 1043.863 ms; worker allocation 65120 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.977; 591.337 ms; worker allocation 1410264 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.076; 10334.845 ms; worker allocation 124264 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.987; 583.777 ms; worker allocation 1490096 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.524; 1038.102 ms; worker allocation 64656 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.952; 606.495 ms; worker allocation 1408464 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.076; 10346.209 ms; worker allocation 165856 bytes
|
||||
@@ -1,14 +0,0 @@
|
||||
Java openjdk 25.0.4.1 2026-08-18 LTS
|
||||
Platform Windows 2025Server AMD64; logical CPUs 4
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.952; 557.784 ms; worker allocation 1491496 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.556; 1038.982 ms; worker allocation 17776 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.852; 623.419 ms; worker allocation 1410384 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.078; 10247.387 ms; worker allocation 214896 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.998; 548.088 ms; worker allocation 1489616 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.574; 1034.032 ms; worker allocation 15096 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.867; 630.903 ms; worker allocation 1449664 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.078; 10266.232 ms; worker allocation 214904 bytes
|
||||
upstream requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.996; 549.301 ms; worker allocation 1448456 bytes
|
||||
precise requested ratio 0.500; 50000 tasks of 10000 ns; worker CPU/wall 0.452; 1036.321 ms; worker allocation 13776 bytes
|
||||
upstream requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.971; 563.129 ms; worker allocation 1409664 bytes
|
||||
precise requested ratio 0.050; 50000 tasks of 10000 ns; worker CPU/wall 0.100; 10276.324 ms; worker allocation 214744 bytes
|
||||
@@ -22,6 +22,12 @@ serde_json = { version = "1.0.151", features = ["raw_value"] }
|
||||
cpal = "0.16"
|
||||
symphonia = { version = "0.5", default-features = false, features = ["ogg", "vorbis"] }
|
||||
miniz_oxide = "0.8"
|
||||
ab_glyph = "0.2.32"
|
||||
horizon-theme = { path = "../horizon-theme" }
|
||||
|
||||
[features]
|
||||
# Records the call sites of mob random draws (`mob_ai_probe` traces).
|
||||
rng-trace = ["horizon-core/rng-trace"]
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
@@ -0,0 +1,494 @@
|
||||
//! Headless transport for the block-entity animation parity gate: replays each
|
||||
//! scripted case (block, neighbourhood, entities, block events, game times)
|
||||
//! through `horizon_client::block_entity_anim` and prints the same lines as
|
||||
//! `VanillaBlockEntityAnimOracle`: the block entity's fields, the level calls
|
||||
//! its tick made and the render state the renderer derives from `BlockAnim`.
|
||||
#![forbid(unsafe_code)]
|
||||
use horizon_client::{
|
||||
assets::Assets,
|
||||
block_entity_anim::{
|
||||
Bell, BellEntity, BlockEntityAnims, ChestLid, Conduit, ConduitTarget, DIRECTIONS,
|
||||
EndGateway, PotWobble, Shulker, ShulkerStatus, Skull, WobbleStyle, chest_lid_x_rot,
|
||||
direction_index,
|
||||
},
|
||||
block_entity_render::{BlockEntityRenderer, gateway_beam},
|
||||
blocks::{BlockFacts, Fluid},
|
||||
items::Items,
|
||||
};
|
||||
use horizon_core::random::LegacyRandom;
|
||||
use horizon_world::registry::{BlockRegistry, BlockStateId};
|
||||
use serde_json::Value;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
fmt::Write as _,
|
||||
fs,
|
||||
io::{BufWriter, Write},
|
||||
path::PathBuf,
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
fn f(v: f32) -> String {
|
||||
format!("{:08x}", v.to_bits())
|
||||
}
|
||||
fn d(v: f64) -> String {
|
||||
format!("{:016x}", v.to_bits())
|
||||
}
|
||||
fn bx(b: [f64; 6]) -> String {
|
||||
b.map(d).join(" ")
|
||||
}
|
||||
|
||||
fn find_state(registry: &BlockRegistry, spec: &str) -> Option<u32> {
|
||||
let (name, props) = match spec.split_once('[') {
|
||||
Some((n, rest)) => (n, rest.trim_end_matches(']')),
|
||||
None => (spec, ""),
|
||||
};
|
||||
let wanted: Vec<(&str, &str)> = props
|
||||
.split(',')
|
||||
.filter(|p| !p.is_empty())
|
||||
.filter_map(|p| p.split_once('='))
|
||||
.collect();
|
||||
let default = registry.state(registry.default_state(name)?)?.clone();
|
||||
(0..registry.len() as u32).find(|&id| {
|
||||
registry.state(BlockStateId(id)).is_some_and(|s| {
|
||||
s.name == name
|
||||
&& s.properties.iter().all(|(k, v)| {
|
||||
wanted
|
||||
.iter()
|
||||
.find(|(wk, _)| wk == k)
|
||||
.map_or(default.properties.get(k) == Some(v), |(_, wv)| wv == v)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fn prop<'a>(spec: &'a str, key: &str) -> Option<&'a str> {
|
||||
let props = spec.split_once('[')?.1.trim_end_matches(']');
|
||||
props
|
||||
.split(',')
|
||||
.filter_map(|p| p.split_once('='))
|
||||
.find(|(k, _)| *k == key)
|
||||
.map(|(_, v)| v)
|
||||
}
|
||||
|
||||
fn offset(key: &str) -> [i32; 3] {
|
||||
let mut it = key.split(',').map(|v| v.parse::<i32>().unwrap_or(0));
|
||||
[
|
||||
it.next().unwrap_or(0),
|
||||
it.next().unwrap_or(0),
|
||||
it.next().unwrap_or(0),
|
||||
]
|
||||
}
|
||||
|
||||
fn mob(e: &Value) -> BellEntity {
|
||||
let p = |i: usize| e["pos"][i].as_f64().unwrap_or(0.0);
|
||||
BellEntity {
|
||||
position: [p(0), p(1), p(2)],
|
||||
alive: e["alive"].as_bool().unwrap_or(true) && !e["removed"].as_bool().unwrap_or(false),
|
||||
raider: e["raider"].as_bool().unwrap_or(false),
|
||||
}
|
||||
}
|
||||
|
||||
fn lid_text(l: Option<&ChestLid>) -> String {
|
||||
l.map_or("-".to_owned(), |l| {
|
||||
format!("{} {} {}", l.should_be_open, f(l.openness), f(l.o_openness))
|
||||
})
|
||||
}
|
||||
|
||||
/// The case's players: feet positions and whether each is a spectator.
|
||||
fn players(v: &Value) -> Vec<([f64; 3], bool)> {
|
||||
v.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|p| {
|
||||
let c = |i: usize| p["pos"][i].as_f64().unwrap_or(0.0);
|
||||
(
|
||||
[c(0), c(1), c(2)],
|
||||
p["spectator"].as_bool().unwrap_or(false),
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn status(s: ShulkerStatus) -> &'static str {
|
||||
match s {
|
||||
ShulkerStatus::Closed => "CLOSED",
|
||||
ShulkerStatus::Opening => "OPENING",
|
||||
ShulkerStatus::Opened => "OPENED",
|
||||
ShulkerStatus::Closing => "CLOSING",
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [root, inputs, output] = args.as_slice() else {
|
||||
return Err("usage: block_entity_anim_fixture RESOURCES INPUTS OUTPUT".into());
|
||||
};
|
||||
let assets = Assets::load(root)?;
|
||||
let registry = assets.registry;
|
||||
let facts = BlockFacts::load(root, registry)?;
|
||||
let renderer = BlockEntityRenderer::load(root, registry)?;
|
||||
let tags = Items::tags_only(root)?;
|
||||
let frames = tags
|
||||
.block_tags
|
||||
.get("minecraft:conduit_effect_block")
|
||||
.cloned()
|
||||
.unwrap_or_default();
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
writeln!(out, "case {}", case["name"].as_str().unwrap_or_default())?;
|
||||
let block = case["block"].as_str().unwrap_or_default().to_owned();
|
||||
let int = |v: &Value| v.as_i64().unwrap_or(0) as i32;
|
||||
let pos = [
|
||||
int(&case["pos"][0]),
|
||||
int(&case["pos"][1]),
|
||||
int(&case["pos"][2]),
|
||||
];
|
||||
// The neighbourhood as block states (conduits).
|
||||
let mut blocks: HashMap<[i32; 3], String> = HashMap::new();
|
||||
blocks.insert(pos, block.clone());
|
||||
let place = |blocks: &mut HashMap<[i32; 3], String>, set: &Value| {
|
||||
for (k, v) in set.as_object().into_iter().flatten() {
|
||||
let o = offset(k);
|
||||
blocks.insert(
|
||||
[pos[0] + o[0], pos[1] + o[1], pos[2] + o[2]],
|
||||
v.as_str().unwrap_or_default().to_owned(),
|
||||
);
|
||||
}
|
||||
};
|
||||
place(&mut blocks, &case["world"]);
|
||||
let entities: Vec<BellEntity> = case["entities"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(mob)
|
||||
.collect();
|
||||
let target = case.get("target").map(|t| {
|
||||
let e = mob(t);
|
||||
ConduitTarget {
|
||||
position: e.position,
|
||||
eye_y: e.position[1] + f64::from(t["eye"].as_f64().unwrap_or(0.0) as f32),
|
||||
width: t["width"].as_f64().unwrap_or(0.0) as f32,
|
||||
height: t["height"].as_f64().unwrap_or(0.0) as f32,
|
||||
}
|
||||
});
|
||||
let mut random = LegacyRandom::new(case["seed"].as_i64().unwrap_or(0));
|
||||
let name = block.split('[').next().unwrap_or_default().to_owned();
|
||||
let mut anims = BlockEntityAnims::default();
|
||||
let partner = case["partner"].as_str().map(|k| {
|
||||
let o = offset(k);
|
||||
[pos[0] + o[0], pos[1] + o[1], pos[2] + o[2]]
|
||||
});
|
||||
let mut gamers = players(&case["players"]);
|
||||
if name == "minecraft:enchanting_table" {
|
||||
anims.book_random = LegacyRandom::new(case["seed"].as_i64().unwrap_or(0));
|
||||
}
|
||||
let facing = prop(&block, "facing")
|
||||
.and_then(direction_index)
|
||||
.unwrap_or(1);
|
||||
// End gateways: the saved age, the level's height range and the
|
||||
// integrated server's copy.
|
||||
let initial = EndGateway {
|
||||
age: case["age"].as_i64().unwrap_or(0),
|
||||
teleport_cooldown: 0,
|
||||
};
|
||||
let max_y = int(&case["level"][0]) + int(&case["level"][1]) - 1;
|
||||
let mut server = initial;
|
||||
let mut text = String::new();
|
||||
for step in case["steps"].as_array().into_iter().flatten() {
|
||||
let time = step["time"].as_i64().unwrap_or(0);
|
||||
let partial = step["partial"].as_f64().unwrap_or(0.0) as f32;
|
||||
let mut log = String::new();
|
||||
place(&mut blocks, &step["set"]);
|
||||
let event = step["event"].as_array().map(|e| (int(&e[0]), int(&e[1])));
|
||||
text.clear();
|
||||
if step.get("players").is_some() {
|
||||
gamers = players(&step["players"]);
|
||||
}
|
||||
if name.ends_with("chest") {
|
||||
let lid = anims.chests.entry(pos).or_default();
|
||||
if let Some((a, b)) = event {
|
||||
let handled = lid.trigger_event(a, b);
|
||||
let _ = write!(log, " event {handled}");
|
||||
}
|
||||
if let Some(other) = partner {
|
||||
let lid = anims.chests.entry(other).or_default();
|
||||
if let Some(e) = step["partnerEvent"].as_array() {
|
||||
let handled = lid.trigger_event(int(&e[0]), int(&e[1]));
|
||||
let _ = write!(log, " partner event {handled}");
|
||||
}
|
||||
}
|
||||
// lidAnimateTick: this chest, then the other half.
|
||||
if let Some(l) = anims.chests.get_mut(&pos) {
|
||||
l.tick();
|
||||
}
|
||||
if let Some(l) = partner.and_then(|p| anims.chests.get_mut(&p)) {
|
||||
l.tick();
|
||||
}
|
||||
let state_at = |p: [i32; 3]| {
|
||||
find_state(
|
||||
registry,
|
||||
blocks.get(&p).map_or("minecraft:air", String::as_str),
|
||||
)
|
||||
.unwrap_or(0)
|
||||
};
|
||||
let (open, _) = renderer
|
||||
.chest_openness_of(pos, state_at(pos), &state_at, &|p| anims.lid(p, partial));
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} partner {} render {} {}",
|
||||
lid_text(anims.chests.get(&pos)),
|
||||
partner.map_or("none".to_owned(), |p| lid_text(anims.chests.get(&p))),
|
||||
f(open),
|
||||
f(chest_lid_x_rot(open))
|
||||
);
|
||||
} else if name == "minecraft:enchanting_table" {
|
||||
let feet: Vec<[f64; 3]> = gamers
|
||||
.iter()
|
||||
.filter(|(_, spectator)| !spectator)
|
||||
.map(|(p, _)| *p)
|
||||
.collect();
|
||||
let BlockEntityAnims {
|
||||
books, book_random, ..
|
||||
} = &mut anims;
|
||||
books.entry(pos).or_default().tick(pos, &feet, book_random);
|
||||
let b = anims.books[&pos];
|
||||
let r = anims
|
||||
.block_anim(pos, time, partial, Default::default())
|
||||
.book
|
||||
.render(partial);
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} {} {} {} {} {} {} {} {} render {} {} {} {} book {} {} {}",
|
||||
b.time,
|
||||
f(b.flip),
|
||||
f(b.o_flip),
|
||||
f(b.flip_t),
|
||||
f(b.flip_a),
|
||||
f(b.open),
|
||||
f(b.o_open),
|
||||
f(b.rot),
|
||||
f(b.o_rot),
|
||||
f(b.t_rot),
|
||||
f(r.flip),
|
||||
f(r.open),
|
||||
f(r.time),
|
||||
f(r.y_rot),
|
||||
f(r.openness),
|
||||
f(r.page_flip1),
|
||||
f(r.page_flip2)
|
||||
);
|
||||
} else if name.ends_with("shulker_box") {
|
||||
let s = anims.shulkers.entry(pos).or_insert_with(Shulker::default);
|
||||
if let Some((a, b)) = event {
|
||||
let handled = s.trigger_event(a, b);
|
||||
let _ = write!(log, " event {handled}");
|
||||
}
|
||||
let tick = s.tick(pos, facing);
|
||||
for _ in 0..tick.neighbor_updates {
|
||||
log.push_str(" neighbors");
|
||||
}
|
||||
if let Some(b) = tick.push {
|
||||
let _ = write!(log, " push {}", bx(b));
|
||||
}
|
||||
let (count, st) = (s.open_count, s.status);
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
// ShulkerBoxRenderer: getProgress(partial).
|
||||
let (progress, old) = a.shulker;
|
||||
let render = old + partial * (progress - old);
|
||||
let s = &anims.shulkers[&pos];
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} {} {} render {}",
|
||||
status(st),
|
||||
count,
|
||||
f(s.progress),
|
||||
f(s.progress_old),
|
||||
f(render)
|
||||
);
|
||||
} else if name == "minecraft:bell" {
|
||||
let b = anims.bells.entry(pos).or_insert_with(Bell::default);
|
||||
if let Some((e0, e1)) = event {
|
||||
let handled = b.trigger_event(e0, e1, time, || {
|
||||
let inflated = [
|
||||
f64::from(pos[0]) - 48.0,
|
||||
f64::from(pos[1]) - 48.0,
|
||||
f64::from(pos[2]) - 48.0,
|
||||
f64::from(pos[0]) + 1.0 + 48.0,
|
||||
f64::from(pos[1]) + 1.0 + 48.0,
|
||||
f64::from(pos[2]) + 1.0 + 48.0,
|
||||
];
|
||||
let _ = write!(log, " gather {}", bx(inflated));
|
||||
(0..entities.len() as u64)
|
||||
.filter(|&i| {
|
||||
let p = entities[i as usize].position;
|
||||
(0..3).all(|a| p[a] >= inflated[a] && p[a] < inflated[a + 3])
|
||||
})
|
||||
.collect()
|
||||
});
|
||||
let _ = write!(log, " event {handled}");
|
||||
}
|
||||
if !step["noTick"].as_bool().unwrap_or(false) {
|
||||
let tick = b.tick(pos, |h| entities.get(h as usize).copied());
|
||||
if tick.resonate {
|
||||
log.push_str(" sound minecraft:block.bell.resonate");
|
||||
}
|
||||
if let Some((particles, _)) = tick.ended {
|
||||
for (p, color) in particles {
|
||||
let _ = write!(
|
||||
log,
|
||||
" particle minecraft:entity_effect {color} {} {} {} {} {} {}",
|
||||
d(p[0]),
|
||||
d(p[1]),
|
||||
d(p[2]),
|
||||
d(0.0),
|
||||
d(0.0),
|
||||
d(0.0)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
let b = &anims.bells[&pos];
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
let dir = |d: Option<&str>| d.map_or("null".to_owned(), str::to_owned);
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} {} {} {} {} render {} {}",
|
||||
b.ticks,
|
||||
b.shaking,
|
||||
dir(b.click_direction.map(|d| DIRECTIONS[usize::from(d)])),
|
||||
b.resonating,
|
||||
b.resonation_ticks,
|
||||
b.last_ring_timestamp,
|
||||
f(a.bell_ticks as f32 + partial),
|
||||
dir(a.bell_shake)
|
||||
);
|
||||
} else if name == "minecraft:conduit" {
|
||||
let c = anims.conduits.entry(pos).or_insert_with(Conduit::default);
|
||||
let state_of = |p: [i32; 3]| -> Option<u32> {
|
||||
find_state(
|
||||
registry,
|
||||
blocks.get(&p).map_or("minecraft:air", String::as_str),
|
||||
)
|
||||
};
|
||||
let is_water = |p: [i32; 3]| {
|
||||
state_of(p).is_some_and(|s| facts.get(BlockStateId(s)).fluid == Fluid::Water)
|
||||
};
|
||||
let is_frame = |p: [i32; 3]| {
|
||||
let spec = blocks.get(&p).map_or("minecraft:air", String::as_str);
|
||||
frames.contains(spec.split('[').next().unwrap_or_default())
|
||||
};
|
||||
let particles = c.client_tick(pos, time, is_water, is_frame, target, &mut random);
|
||||
for (p, v) in particles {
|
||||
let _ = write!(
|
||||
log,
|
||||
" particle minecraft:nautilus {} {} {} {} {} {}",
|
||||
d(p[0]),
|
||||
d(p[1]),
|
||||
d(p[2]),
|
||||
d(v[0]),
|
||||
d(v[1]),
|
||||
d(v[2])
|
||||
);
|
||||
}
|
||||
let c = &anims.conduits[&pos];
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
// ConduitRenderer.extractRenderState as block_entity_render derives it.
|
||||
let (ticks, active, hunting, raw) = a.conduit;
|
||||
let rotation = (raw + if active { partial } else { 0.0 }) * -0.0375;
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} {} {} {} render {} {} {} {} {}",
|
||||
c.tick_count,
|
||||
c.is_active,
|
||||
c.is_hunting,
|
||||
f(c.active_rotation),
|
||||
c.effect_blocks.len(),
|
||||
active,
|
||||
f(rotation),
|
||||
f(ticks as f32 + partial),
|
||||
ticks / 66 % 3,
|
||||
hunting
|
||||
);
|
||||
} else if name.ends_with("_head") || name.ends_with("_skull") {
|
||||
let now = step["state"].as_str().unwrap_or(&block);
|
||||
let s = anims.skulls.entry(pos).or_insert_with(Skull::default);
|
||||
s.tick(prop(now, "powered") == Some("true"));
|
||||
let s = anims.skulls[&pos];
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
// block_entity_render: count + partial while animating.
|
||||
let (animating, count) = a.skull;
|
||||
let render = count as f32 + if animating { partial } else { 0.0 };
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} render {}",
|
||||
s.animating,
|
||||
s.tick_count,
|
||||
f(render)
|
||||
);
|
||||
} else if name == "minecraft:decorated_pot" {
|
||||
let w = anims.pots.entry(pos).or_insert_with(PotWobble::default);
|
||||
if let Some((e0, e1)) = event {
|
||||
let handled = w.trigger_event(e0, e1, time);
|
||||
let _ = write!(log, " event {handled}");
|
||||
}
|
||||
let w = anims.pots[&pos];
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
let (style, progress) = match a.wobble {
|
||||
Some((true, p)) => ("POSITIVE", p),
|
||||
Some((false, p)) => ("null", p),
|
||||
None => ("null", 0.0),
|
||||
};
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} render {} {}",
|
||||
w.started_at,
|
||||
match w.style {
|
||||
Some(WobbleStyle::Positive) => "POSITIVE",
|
||||
Some(WobbleStyle::Negative) => "NEGATIVE",
|
||||
None => "null",
|
||||
},
|
||||
f(progress),
|
||||
style
|
||||
);
|
||||
} else if name == "minecraft:end_gateway" {
|
||||
let client = anims.gateways.entry(pos).or_insert(initial);
|
||||
if step["enter"].as_bool() == Some(true) && server.enter() {
|
||||
log.push_str(" blockEvent 1 0");
|
||||
client.trigger_event(1, 0);
|
||||
}
|
||||
if server.portal_tick() {
|
||||
log.push_str(" blockEvent 1 0");
|
||||
client.trigger_event(1, 0);
|
||||
}
|
||||
if let Some((e0, e1)) = event {
|
||||
let handled = client.trigger_event(e0, e1);
|
||||
let _ = write!(log, " event {handled}");
|
||||
}
|
||||
client.tick();
|
||||
let g = *client;
|
||||
let a = anims.block_anim(pos, time, partial, Default::default());
|
||||
let b = gateway_beam(a.gateway, partial, max_y, time);
|
||||
let _ = write!(
|
||||
text,
|
||||
"{} {} server {} {} render {} {} {:x} {}",
|
||||
g.age,
|
||||
g.teleport_cooldown,
|
||||
server.age,
|
||||
server.teleport_cooldown,
|
||||
b.height,
|
||||
f(b.scale),
|
||||
b.color,
|
||||
f(b.animation_time)
|
||||
);
|
||||
} else {
|
||||
text = format!("unsupported {block}");
|
||||
}
|
||||
writeln!(out, "{text} |{log}")?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -7,9 +7,13 @@ use glam::{DVec3, Mat4, Quat, Vec3};
|
||||
use horizon_client::{
|
||||
assets::Assets,
|
||||
banner::{self, Banners},
|
||||
block_entity_render::{BlockAnim, BlockEntityRenderer, Scene, TextCall},
|
||||
block_entity_anim::EnchantingBook,
|
||||
block_entity_render::{
|
||||
BlockAnim, BlockEntityRenderer, END_GATEWAY_LAYER, END_PORTAL_LAYER, Scene, TextCall,
|
||||
},
|
||||
chunk::{Chunk, Light},
|
||||
hud::{HudAtlas, Rect},
|
||||
item_render::{ItemRenderer, gui},
|
||||
signs::{DYE_TEXT, SignData, SignText},
|
||||
world::World,
|
||||
};
|
||||
@@ -113,9 +117,10 @@ fn main() -> Result<()> {
|
||||
};
|
||||
let assets = Assets::load(root)?;
|
||||
let registry = assets.registry;
|
||||
let mut renderer = BlockEntityRenderer::load(root, registry)?;
|
||||
let renderer = BlockEntityRenderer::load(root, registry)?;
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
let banners = Banners::load(root);
|
||||
let items = ItemRenderer::load(root)?;
|
||||
let (sprites, names, grid) = fake_sprites(textures)?;
|
||||
let air = registry.default_state("minecraft:air").ok_or("no air")?;
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
@@ -125,6 +130,43 @@ fn main() -> Result<()> {
|
||||
{
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let block = case["block"].as_str().unwrap_or_default();
|
||||
if let Some(loom) = case.get("loom") {
|
||||
// The loom's result preview, as LoomScreen draws it at (0, 0).
|
||||
let layers: Vec<(String, String)> = loom["patterns"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|p| {
|
||||
(
|
||||
banners.banner_texture(p[0].as_str().unwrap_or_default()),
|
||||
p[1].as_str().unwrap_or_default().to_owned(),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
let base = loom["base"].as_str().unwrap_or_default();
|
||||
let flat = gui::items_flat_lights();
|
||||
let quads: Vec<Value> =
|
||||
gui::banner_result_quads(&items, &sprites, 0.0, 0.0, base, &layers)
|
||||
.iter()
|
||||
.map(|q| {
|
||||
let (cu, cv) = ((q.uv[0][0] / 2.0).floor(), (q.uv[0][1] / 2.0).floor());
|
||||
let texture = names
|
||||
.get(cu as usize + cv as usize * grid)
|
||||
.cloned()
|
||||
.unwrap_or_default();
|
||||
let v: Vec<Value> = (0..4)
|
||||
.map(|k| {
|
||||
let p = q.pos[k];
|
||||
json!([p.x, p.y, p.z, q.uv[k][0] - cu * 2.0, q.uv[k][1] - cv * 2.0])
|
||||
})
|
||||
.collect();
|
||||
// Full bright (15728880).
|
||||
json!({"texture": texture, "v": v, "color": gui::lit_color(q, flat), "light": 0xF0F0})
|
||||
})
|
||||
.collect();
|
||||
writeln!(out, "{}", json!({"quads": quads, "texts": []}))?;
|
||||
continue;
|
||||
}
|
||||
if block == "minecraft:beacon" {
|
||||
// BeaconRenderer: the beam sections from the case, as Horizon's beacon keeps them.
|
||||
let int = |v: &Value| v.as_i64().unwrap_or(0);
|
||||
@@ -196,13 +238,41 @@ fn main() -> Result<()> {
|
||||
world.chunks.insert((cx, cz), Arc::new(chunk));
|
||||
}
|
||||
}
|
||||
if let Some(book) = case.get("book") {
|
||||
renderer.set_book(
|
||||
pos,
|
||||
int(&book["time"]),
|
||||
["flip", "oFlip", "open", "oOpen", "rot", "oRot"].map(|k| float(&book[k])),
|
||||
);
|
||||
// Neighbour blocks the case sets (End gateway faces).
|
||||
for (direction, spec) in case["neighbours"].as_object().into_iter().flatten() {
|
||||
let d = match direction.as_str() {
|
||||
"down" => [0, -1, 0],
|
||||
"up" => [0, 1, 0],
|
||||
"north" => [0, 0, -1],
|
||||
"south" => [0, 0, 1],
|
||||
"west" => [-1, 0, 0],
|
||||
_ => [1, 0, 0],
|
||||
};
|
||||
let neighbour = find_state(registry, spec.as_str().unwrap_or_default())
|
||||
.ok_or("unknown neighbour state")?;
|
||||
world.set(
|
||||
pos[0] + d[0],
|
||||
pos[1] + d[1],
|
||||
pos[2] + d[2],
|
||||
BlockStateId(neighbour),
|
||||
)?;
|
||||
}
|
||||
let book = case
|
||||
.get("book")
|
||||
.map_or_else(EnchantingBook::default, |book| {
|
||||
let [flip, o_flip, open, o_open, rot, o_rot] =
|
||||
["flip", "oFlip", "open", "oOpen", "rot", "oRot"].map(|k| float(&book[k]));
|
||||
EnchantingBook {
|
||||
time: int(&book["time"]),
|
||||
flip,
|
||||
o_flip,
|
||||
open,
|
||||
o_open,
|
||||
rot,
|
||||
o_rot,
|
||||
..EnchantingBook::default()
|
||||
}
|
||||
});
|
||||
let sign = case.get("sign").map(|s| {
|
||||
let mut data = SignData {
|
||||
hanging: block.contains("hanging"),
|
||||
@@ -246,6 +316,16 @@ fn main() -> Result<()> {
|
||||
wobble: case["wobble"]
|
||||
.as_array()
|
||||
.map(|w| (w[0].as_str() == Some("POSITIVE"), float(&w[1]))),
|
||||
book,
|
||||
gateway: (
|
||||
case["gateway"]["age"].as_i64().unwrap_or(0),
|
||||
int(&case["gateway"]["cooldown"]),
|
||||
),
|
||||
};
|
||||
// The case's level height (minimum y, height): the End's by default.
|
||||
let max_y = match case["level"].as_array() {
|
||||
Some(l) => int(&l[0]) + int(&l[1]) - 1,
|
||||
None => 255,
|
||||
};
|
||||
let open = float(&case["open"]);
|
||||
let near = case["sign"]["near"].as_bool().unwrap_or(false);
|
||||
@@ -279,7 +359,8 @@ fn main() -> Result<()> {
|
||||
anim: &|_| anim.clone(),
|
||||
texts: Some(&texts),
|
||||
partial: float(&case["partial"]),
|
||||
game_time: 0,
|
||||
game_time: case["gameTime"].as_i64().unwrap_or(0),
|
||||
max_y,
|
||||
world: &world,
|
||||
sprites: &sprites,
|
||||
nether: false,
|
||||
@@ -293,6 +374,26 @@ fn main() -> Result<()> {
|
||||
let quads: Vec<Value> = verts
|
||||
.chunks(4)
|
||||
.map(|q| {
|
||||
// Custom geometry: the End portal shader's position-only cube (its
|
||||
// render type samples end_sky first) and End gateway beams.
|
||||
if q[0].layer == END_PORTAL_LAYER || q[0].layer == END_GATEWAY_LAYER {
|
||||
let v: Vec<Value> = q
|
||||
.iter()
|
||||
.map(|v| json!([v.pos[0], v.pos[1], v.pos[2], v.uv[0], v.uv[1]]))
|
||||
.collect();
|
||||
return json!({"texture": "environment/end_sky", "v": v, "color": q[0].color,
|
||||
"light": q[0].light, "custom": true});
|
||||
}
|
||||
if q[0].layer == 6 {
|
||||
let texture = "entity/end_portal/end_gateway_beam";
|
||||
let u0 = sprites.get(texture).map_or(0.0, |r| r.u0);
|
||||
let v: Vec<Value> = q
|
||||
.iter()
|
||||
.map(|v| json!([v.pos[0], v.pos[1], v.pos[2], v.uv[0] - u0, v.uv[1]]))
|
||||
.collect();
|
||||
return json!({"texture": texture, "v": v, "color": q[0].color,
|
||||
"light": q[0].light, "custom": true});
|
||||
}
|
||||
let (cu, cv) = ((q[0].uv[0] / 2.0).floor(), (q[0].uv[1] / 2.0).floor());
|
||||
let texture = names
|
||||
.get(cu as usize + cv as usize * grid)
|
||||
|
||||
@@ -80,10 +80,13 @@ fn main() -> horizon_client::Result<()> {
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let brewing = horizon_client::brewing::Brewing::load(root, &items);
|
||||
// The inventory menu never reads banner patterns.
|
||||
let banners = horizon_client::banner::Banners::default();
|
||||
let env = Env {
|
||||
items: &items,
|
||||
recipes: &recipes,
|
||||
brewing: &brewing,
|
||||
banners: &banners,
|
||||
};
|
||||
let mut out = String::new();
|
||||
for line in input.lines() {
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
//! The chat screen's input for tools/test_chat_screen_parity.py: reads one
|
||||
//! JSON case per line (GUI size, history, options, typed text, keys,
|
||||
//! clicks, mouse), runs `horizon_client::chat::ChatScreen` on the vanilla
|
||||
//! command tree and writes the input's state and the screen's GUI calls in
|
||||
//! the oracle's JSON form.
|
||||
//!
|
||||
//! usage: chat_screen_fixture RESOURCES REGISTRIES CASES OUTPUT
|
||||
use horizon_client::{
|
||||
chat::{ChatAction, ChatScreen, Commands},
|
||||
command::vanilla,
|
||||
hud::HudAtlas,
|
||||
lang,
|
||||
screen_draw::Measure,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fmt::Write as _, fs, path::PathBuf};
|
||||
use winit::keyboard::KeyCode as K;
|
||||
#[path = "pack_screen_fixture.rs"]
|
||||
#[allow(dead_code)]
|
||||
mod pack_screen_fixture;
|
||||
#[path = "chat_screen_fixture/registries.rs"]
|
||||
mod registries;
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [root, registries, inputs, output] = args.as_slice() else {
|
||||
return Err("usage: chat_screen_fixture RESOURCES REGISTRIES CASES OUTPUT".into());
|
||||
};
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
lang::set(lang::Language::load(&[root], lang::DEFAULT));
|
||||
let m = Measure(&atlas.font);
|
||||
let reg = registries::registries(&serde_json::from_slice(&fs::read(registries)?)?, 4);
|
||||
let c = Commands {
|
||||
dispatcher: vanilla::release_dispatcher(),
|
||||
registries: ®,
|
||||
};
|
||||
let mut out = String::new();
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let int = |v: &Value| v.as_i64().unwrap_or(0) as i32;
|
||||
let history: Vec<String> = case["history"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|s| s.as_str().map(str::to_owned))
|
||||
.collect();
|
||||
let (w, h) = (int(&case["width"]), int(&case["height"]));
|
||||
let mut screen = ChatScreen::new(
|
||||
&m,
|
||||
&c,
|
||||
case["initial"].as_str().unwrap_or(""),
|
||||
history.len(),
|
||||
w,
|
||||
h,
|
||||
);
|
||||
screen.auto_suggestions = case["autoSuggest"] == true;
|
||||
let mut closed = false;
|
||||
for a in case["actions"].as_array().into_iter().flatten() {
|
||||
match a["type"].as_str().unwrap_or_default() {
|
||||
"type" => screen.type_text(&m, &c, a["text"].as_str().unwrap_or_default()),
|
||||
"click" => {
|
||||
screen.click(
|
||||
&m,
|
||||
&c,
|
||||
a["x"].as_f64().unwrap_or(0.0),
|
||||
a["y"].as_f64().unwrap_or(0.0),
|
||||
);
|
||||
}
|
||||
"key" => {
|
||||
let mut name = a["key"].as_str().unwrap_or_default();
|
||||
let (mut shift, mut ctrl) = (false, false);
|
||||
loop {
|
||||
if let Some(n) = name.strip_prefix("shift+") {
|
||||
shift = true;
|
||||
name = n;
|
||||
} else if let Some(n) = name.strip_prefix("ctrl+") {
|
||||
ctrl = true;
|
||||
name = n;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
let key = match name {
|
||||
"backspace" => K::Backspace,
|
||||
"delete" => K::Delete,
|
||||
"home" => K::Home,
|
||||
"end" => K::End,
|
||||
"right" => K::ArrowRight,
|
||||
"left" => K::ArrowLeft,
|
||||
"down" => K::ArrowDown,
|
||||
"up" => K::ArrowUp,
|
||||
"tab" => K::Tab,
|
||||
"escape" => K::Escape,
|
||||
_ => K::KeyA,
|
||||
};
|
||||
// InputQuirks.EDIT_SHORTCUT_KEY_MODIFIER: Cmd, not Ctrl, on macOS.
|
||||
let ctrl = ctrl && !cfg!(target_os = "macos");
|
||||
if screen.key(&m, &c, &history, key, shift, ctrl) != ChatAction::None {
|
||||
closed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if closed {
|
||||
writeln!(out, "{}", json!({"closed": true}))?;
|
||||
continue;
|
||||
}
|
||||
// Options.getBackgroundColor(Integer.MIN_VALUE).
|
||||
let background = if case["chatOnly"] == true {
|
||||
i32::MIN
|
||||
} else {
|
||||
let a = (case["opacity"].as_f64().unwrap_or(0.0) as f32 * 255.0).floor() as i32;
|
||||
a << 24
|
||||
};
|
||||
let mouse = (int(&case["mouse"][0]), int(&case["mouse"][1]));
|
||||
let draws = screen.draw(&m, mouse, case["blink"].as_u64().unwrap_or(0), background);
|
||||
let input = &screen.input;
|
||||
writeln!(
|
||||
out,
|
||||
"{}",
|
||||
json!({"value": input.value, "cursor": input.cursor, "highlight": input.highlight, "display": input.display,
|
||||
"draws": pack_screen_fixture::encode(&draws)})
|
||||
)?;
|
||||
}
|
||||
fs::write(output, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
//! The registries VanillaCommandParseOracle exports (`registries` mode), as
|
||||
//! the command dispatcher reads them; shared by the command fixtures.
|
||||
use horizon_client::command::{Registries, args::RegistryIds};
|
||||
use serde_json::Value;
|
||||
|
||||
fn strings(v: &Value) -> Vec<String> {
|
||||
v.as_array()
|
||||
.map(|a| {
|
||||
a.iter()
|
||||
.filter_map(|x| x.as_str().map(str::to_owned))
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn registries(r: &Value, permission: u8) -> Registries {
|
||||
let mut reg = Registries {
|
||||
permission,
|
||||
..Registries::default()
|
||||
};
|
||||
reg.items = strings(&r["items"]);
|
||||
reg.item_tags = strings(&r["item_tags"]);
|
||||
reg.block_tags = strings(&r["block_tags"]);
|
||||
for (id, props) in r["blocks"].as_object().into_iter().flatten() {
|
||||
let props = props
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|p| (p[0].as_str().unwrap_or("").to_owned(), strings(&p[1])))
|
||||
.collect();
|
||||
reg.blocks.insert(id.clone(), props);
|
||||
}
|
||||
reg.summonable = strings(&r["summonable"]);
|
||||
reg.entity_types = strings(&r["entity_types"]);
|
||||
reg.effects = strings(&r["effects"]);
|
||||
reg.attributes = strings(&r["attributes"]);
|
||||
reg.sounds = strings(&r["sounds"]);
|
||||
reg.enchantments = strings(&r["enchantments"]);
|
||||
reg.structures = strings(&r["structures"]);
|
||||
reg.biomes = strings(&r["biomes"]);
|
||||
reg.damage_types = strings(&r["damage_types"]);
|
||||
reg.clocks = strings(&r["clocks"]);
|
||||
reg.timelines = strings(&r["timelines"]);
|
||||
reg.dimensions = strings(&r["dimensions"]);
|
||||
reg.players = strings(&r["players"]);
|
||||
reg.teams = strings(&r["teams"]);
|
||||
reg.objectives = strings(&r["objectives"]);
|
||||
reg.tracked = strings(&r["tracked"]);
|
||||
for (name, entry) in r["by_registry"].as_object().into_iter().flatten() {
|
||||
reg.by_registry.insert(
|
||||
name.clone(),
|
||||
RegistryIds {
|
||||
ids: strings(&entry["ids"]),
|
||||
tags: strings(&entry["tags"]),
|
||||
},
|
||||
);
|
||||
}
|
||||
reg.block_entities = strings(&r["block_entities"]).into_iter().collect();
|
||||
for (tag, members) in r["block_tag_members"].as_object().into_iter().flatten() {
|
||||
reg.block_tag_members.insert(tag.clone(), strings(members));
|
||||
}
|
||||
reg.templates = strings(&r["templates"]);
|
||||
reg.persistent_components = strings(&r["persistent_components"]);
|
||||
reg.learnable_recipes = strings(&r["learnable_recipes"]);
|
||||
for (clock, markers) in r["clock_time_markers"].as_object().into_iter().flatten() {
|
||||
reg.clock_time_markers
|
||||
.insert(clock.clone(), strings(markers));
|
||||
}
|
||||
for (id, criteria) in r["advancement_criteria"].as_object().into_iter().flatten() {
|
||||
reg.advancement_criteria
|
||||
.insert(id.clone(), strings(criteria));
|
||||
}
|
||||
reg.datapacks_enabled = strings(&r["datapacks_selected"]);
|
||||
let enabled = reg.datapacks_enabled.clone();
|
||||
reg.datapacks_disabled = strings(&r["datapacks_enableable"])
|
||||
.into_iter()
|
||||
.filter(|p| !enabled.contains(p))
|
||||
.collect();
|
||||
reg.advancements = reg.ids("minecraft:advancement").to_vec();
|
||||
reg.recipes = reg.ids("minecraft:recipe").to_vec();
|
||||
reg.loot_tables = reg.ids("minecraft:loot_table").to_vec();
|
||||
reg.predicates = reg.ids("minecraft:predicate").to_vec();
|
||||
reg.item_modifiers = reg.ids("minecraft:item_modifier").to_vec();
|
||||
reg
|
||||
}
|
||||
@@ -61,6 +61,7 @@ fn parser_id(ty: &ArgType) -> String {
|
||||
_ => "minecraft:template_rotation".into(),
|
||||
},
|
||||
ArgType::HexColor => "minecraft:hex_color".into(),
|
||||
ArgType::ResourceSelector(_) => "minecraft:resource_selector".into(),
|
||||
ArgType::Uuid => "minecraft:uuid".into(),
|
||||
ArgType::GameProfile => "minecraft:game_profile".into(),
|
||||
ArgType::Style => "minecraft:style".into(),
|
||||
@@ -120,7 +121,8 @@ fn tree(d: &Dispatcher, node: usize) -> Value {
|
||||
}
|
||||
children.insert(child.name().to_owned(), v);
|
||||
}
|
||||
let mut v = json!({"children": children});
|
||||
let order: Vec<&str> = n.children.iter().map(|&c| d.nodes[c].name()).collect();
|
||||
let mut v = json!({"children": children, "order": order});
|
||||
if n.command.is_some() {
|
||||
v["executable"] = json!(true);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ use horizon_client::mobs::{
|
||||
anim::{self, Poses, State},
|
||||
aquatic, body_anim as b_anim, equine, guardian,
|
||||
keyframes::AnimationState,
|
||||
shulker, species, tame,
|
||||
shulker, sniffer, species, tame,
|
||||
};
|
||||
use horizon_core::geometry::Vec3;
|
||||
use serde_json::{Value, json};
|
||||
@@ -173,6 +173,56 @@ fn entity_state(mob: &mut Mob, species: Species, case: &Value) {
|
||||
mob.anim.states[i].started = case[k].as_f64().map(|v| v as f32);
|
||||
}
|
||||
}
|
||||
Species::Breeze => {
|
||||
// breeze::anim's state slots.
|
||||
for (i, k) in ["idle", "shoot", "slide", "slideBack", "inhale", "longJump"]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
{
|
||||
mob.anim.states[i].started = case[k].as_f64().map(|v| v as f32);
|
||||
}
|
||||
}
|
||||
Species::Sniffer => {
|
||||
if flag("isSearching") {
|
||||
mob.extra.variant = sniffer::SEARCHING;
|
||||
}
|
||||
// Sniffer's animation states, in `sniffer::anim`'s order.
|
||||
for (i, k) in [
|
||||
"feelingHappyAnimationState",
|
||||
"scentingAnimationState",
|
||||
"sniffingAnimationState",
|
||||
"diggingAnimationState",
|
||||
"risingAnimationState",
|
||||
]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
{
|
||||
mob.anim.states[i].started = case[k].as_f64().map(|v| v as f32);
|
||||
}
|
||||
}
|
||||
Species::HappyGhast => {
|
||||
mob.extra.head = case["bodyItem"].as_str().map(Into::into);
|
||||
if flag("isRidden") {
|
||||
mob.rider = Some(Default::default());
|
||||
}
|
||||
}
|
||||
Species::Warden => {
|
||||
use horizon_client::mobs::warden;
|
||||
mob.anim.v[warden::TENDRIL] = num("tendrilAnimation") * 10.0;
|
||||
mob.anim.vo[warden::TENDRIL] = num("tendrilAnimation") * 10.0;
|
||||
mob.anim.v[warden::HEART] = num("heartAnimation") * 10.0;
|
||||
mob.anim.vo[warden::HEART] = num("heartAnimation") * 10.0;
|
||||
for (i, k) in [
|
||||
(warden::ROAR, "roarAnimationState"),
|
||||
(warden::SNIFF, "sniffAnimationState"),
|
||||
(warden::EMERGE, "emergeAnimationState"),
|
||||
(warden::DIGGING, "diggingAnimationState"),
|
||||
(warden::ATTACK, "attackAnimationState"),
|
||||
(warden::SONIC_BOOM, "sonicBoomAnimationState"),
|
||||
] {
|
||||
mob.anim.states[i].started = case[k].as_f64().map(|v| v as f32);
|
||||
}
|
||||
}
|
||||
Species::Witch if flag("isHoldingItem") => {
|
||||
mob.extra.main_hand = Some("minecraft:potion".into());
|
||||
}
|
||||
@@ -215,6 +265,13 @@ fn main() -> horizon_client::Result<()> {
|
||||
base = base.replace(cut, "");
|
||||
}
|
||||
let base = base.replace("undead_horse#", "zombie_horse#");
|
||||
// The breeze's wind and eyes and the creaking's eyes are layers of
|
||||
// the species' own model class; LlamaDecorLayer's model animates like
|
||||
// the llama.
|
||||
let base = base
|
||||
.replace("#wind", "#main")
|
||||
.replace("#eyes", "#main")
|
||||
.replace("#decor", "#main");
|
||||
let base = base.trim_start_matches("cold_").trim_start_matches("warm_");
|
||||
let Some(def) = species::ALL.iter().find(|d| {
|
||||
d.model == layer
|
||||
@@ -222,6 +279,11 @@ fn main() -> horizon_client::Result<()> {
|
||||
|| d.model == base
|
||||
|| d.model.trim_end_matches("#main") == base.trim_end_matches("#main")
|
||||
|| norm(d.model) == base
|
||||
// The warden's emissive layers are its model over other parts.
|
||||
|| (["#tendrils", "#heart", "#bioluminescent", "#pulsating_spots"]
|
||||
.iter()
|
||||
.any(|s| layer.ends_with(s))
|
||||
&& d.model == format!("{}#main", layer.split('#').next().unwrap_or_default()))
|
||||
}) else {
|
||||
out.push_str(&format!("{}\n", json!({"skip": "no species"})));
|
||||
continue;
|
||||
@@ -370,6 +432,22 @@ fn main() -> horizon_client::Result<()> {
|
||||
},
|
||||
&animations,
|
||||
),
|
||||
Species::CopperGolem => {
|
||||
// CopperGolemRenderState's animation states, in the golem's slots.
|
||||
for (slot, key) in [
|
||||
"idleAnimationState",
|
||||
"interactionGetItem",
|
||||
"interactionGetNoItem",
|
||||
"interactionDropItem",
|
||||
"interactionDropNoItem",
|
||||
]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
{
|
||||
mob.anim.states[slot] = started(key);
|
||||
}
|
||||
horizon_client::mobs::copper_golem::anim(&mob, s, p, &animations);
|
||||
}
|
||||
Species::Rabbit => b_anim::rabbit(
|
||||
p,
|
||||
s,
|
||||
|
||||
@@ -0,0 +1,531 @@
|
||||
//! `Mob.finalizeSpawn` for differential tests against vanilla
|
||||
//! (tools/test_finalize_spawn_parity.py): reads the cases of
|
||||
//! `VanillaFinalizeSpawnOracle`, runs `mobs::finalize` with the same level
|
||||
//! random and entity randoms, and prints every entity of the case in the
|
||||
//! oracle's format.
|
||||
//!
|
||||
//! usage: finalize_spawn_fixture RESOURCES INPUT OUTPUT HALLOWEEN
|
||||
use horizon_client::{
|
||||
assets::Assets,
|
||||
blocks::BlockFacts,
|
||||
enchant::Enchantments,
|
||||
items::Items,
|
||||
mobs::{
|
||||
Mob, MobTypes, Species,
|
||||
data::MobData,
|
||||
finalize::{self, Attr, Ctx, FinalizeLevel, Reason, SpawnData, SpawnRegistries},
|
||||
gear,
|
||||
render::{DYE_NAMES, PROFESSIONS, VILLAGER_TYPES},
|
||||
spawning::LocalDifficulty,
|
||||
},
|
||||
};
|
||||
use horizon_core::{
|
||||
geometry::{Aabb, Vec3},
|
||||
random::{LegacyRandom, RandomSource},
|
||||
};
|
||||
use std::{collections::HashMap, fmt::Write as _, fs, path::Path, sync::Arc};
|
||||
|
||||
struct Level<'a> {
|
||||
types: &'a MobTypes,
|
||||
data: &'a MobData,
|
||||
biome: String,
|
||||
structure: Option<(String, [i32; 6])>,
|
||||
phase: usize,
|
||||
monsters: bool,
|
||||
peaceful: bool,
|
||||
time: i64,
|
||||
halloween: bool,
|
||||
roof: Option<i32>,
|
||||
eseed: i64,
|
||||
/// Every entity of the case in creation order (case chickens first).
|
||||
created: usize,
|
||||
/// The level's entities that can carry a zombie: (id, bounds, ridden).
|
||||
chickens: Vec<(u32, Aabb, bool)>,
|
||||
rides: Vec<(u32, u32)>,
|
||||
}
|
||||
impl FinalizeLevel for Level<'_> {
|
||||
fn biome(&self, _pos: [i32; 3]) -> String {
|
||||
self.biome.clone()
|
||||
}
|
||||
fn biome_tag(&self, tag: &str, _pos: [i32; 3]) -> bool {
|
||||
self.data.biome_has(tag, &self.biome)
|
||||
}
|
||||
fn structures_with_piece_at(&self, pos: [i32; 3]) -> Vec<String> {
|
||||
match &self.structure {
|
||||
Some((id, b))
|
||||
if pos[0] >= b[0]
|
||||
&& pos[0] <= b[3]
|
||||
&& pos[1] >= b[1]
|
||||
&& pos[1] <= b[4]
|
||||
&& pos[2] >= b[2]
|
||||
&& pos[2] <= b[5] =>
|
||||
{
|
||||
vec![id.clone()]
|
||||
}
|
||||
_ => Vec::new(),
|
||||
}
|
||||
}
|
||||
fn moon_phase(&self, _pos: [i32; 3]) -> usize {
|
||||
self.phase
|
||||
}
|
||||
fn spawning_monsters(&self) -> bool {
|
||||
self.monsters
|
||||
}
|
||||
fn no_collision(&self, bounds: Aabb) -> bool {
|
||||
// A floor under the spawn point and an optional roof layer.
|
||||
self.roof.is_none_or(|y| {
|
||||
let (lo, hi) = (
|
||||
bounds.min(horizon_core::geometry::Axis::Y),
|
||||
bounds.max(horizon_core::geometry::Axis::Y),
|
||||
);
|
||||
!(lo < f64::from(y) + 1.0 && hi > f64::from(y))
|
||||
})
|
||||
}
|
||||
fn free_chicken(&self, bounds: Aabb) -> Option<u32> {
|
||||
self.chickens
|
||||
.iter()
|
||||
.find(|(_, b, ridden)| !ridden && b.intersects(bounds))
|
||||
.map(|c| c.0)
|
||||
}
|
||||
fn ride_chicken(&mut self, chicken: u32, rider: u32) {
|
||||
if let Some(c) = self.chickens.iter_mut().find(|c| c.0 == chicken) {
|
||||
c.2 = true;
|
||||
}
|
||||
self.rides.push((chicken, rider));
|
||||
}
|
||||
fn game_time(&self) -> i64 {
|
||||
self.time
|
||||
}
|
||||
fn halloween(&self) -> bool {
|
||||
self.halloween
|
||||
}
|
||||
fn create(&mut self, kind: &str, _reason: Reason) -> Option<Mob> {
|
||||
if self.peaceful && !finalize::allowed_in_peaceful(kind) {
|
||||
return None;
|
||||
}
|
||||
let t = Arc::new(self.types.types.get(kind)?.clone());
|
||||
let index = self.created;
|
||||
self.created += 1;
|
||||
let mut m = Mob::new(index as u32 + 1, t, Vec3::ZERO, 0.0);
|
||||
m.random = LegacyRandom::new(self.eseed.wrapping_add(index as i64));
|
||||
Some(m)
|
||||
}
|
||||
}
|
||||
|
||||
fn hex64(v: f64) -> String {
|
||||
format!("{:x}", v.to_bits())
|
||||
}
|
||||
fn hex32(v: f32) -> String {
|
||||
format!("{:x}", v.to_bits())
|
||||
}
|
||||
const HORSE: [&str; 7] = [
|
||||
"white",
|
||||
"creamy",
|
||||
"chestnut",
|
||||
"brown",
|
||||
"black",
|
||||
"gray",
|
||||
"dark_brown",
|
||||
];
|
||||
const MARKINGS: [&str; 5] = ["none", "white", "white_field", "white_dots", "black_dots"];
|
||||
const RABBITS: [&str; 6] = ["brown", "white", "black", "white_splotched", "gold", "salt"];
|
||||
const PARROTS: [&str; 5] = ["red_blue", "blue", "green", "yellow_blue", "gray"];
|
||||
const AXOLOTLS: [&str; 5] = ["lucy", "wild", "gold", "cyan", "blue"];
|
||||
const SALMON: [&str; 3] = ["small", "medium", "large"];
|
||||
const GENES: [&str; 7] = [
|
||||
"normal",
|
||||
"lazy",
|
||||
"worried",
|
||||
"playful",
|
||||
"brown",
|
||||
"weak",
|
||||
"aggressive",
|
||||
];
|
||||
const MEMORIES: [&str; 7] = [
|
||||
"long_jump_cooldown",
|
||||
"ram_cooldown",
|
||||
"attack_target_cooldown",
|
||||
"hunted_recently",
|
||||
"dig_cooldown",
|
||||
"is_emerging",
|
||||
"home",
|
||||
];
|
||||
|
||||
fn variant(m: &Mob, regs: &SpawnRegistries, v: &mut Vec<String>) {
|
||||
use Species as S;
|
||||
let s = m.species();
|
||||
let named = |reg: &finalize::VariantRegistry, i: u8| {
|
||||
format!(
|
||||
"minecraft:{}",
|
||||
reg.names.get(i as usize).map_or("?", |n| n.as_str())
|
||||
)
|
||||
};
|
||||
let var = format!("minecraft:{}", finalize::variant_name(s, m.extra.variant));
|
||||
match s {
|
||||
S::Pig => {
|
||||
v.push(var);
|
||||
v.push(named(®s.pig_sound, m.extra.sound_variant));
|
||||
}
|
||||
S::Cow => {
|
||||
v.push(var);
|
||||
v.push(named(®s.cow_sound, m.extra.sound_variant));
|
||||
}
|
||||
S::Mooshroom => v.push(if m.extra.variant == 0 { "red" } else { "brown" }.into()),
|
||||
S::Chicken => {
|
||||
v.push(var);
|
||||
v.push(named(®s.chicken_sound, m.extra.sound_variant));
|
||||
v.push(format!("jockey={}", m.extra.jockey));
|
||||
}
|
||||
S::Cat => {
|
||||
v.push(var);
|
||||
v.push(named(®s.cat_sound, m.extra.sound_variant));
|
||||
}
|
||||
S::Wolf => {
|
||||
v.push(var);
|
||||
v.push(named(®s.wolf_sound, m.extra.sound_variant));
|
||||
}
|
||||
S::Frog | S::ZombieNautilus => v.push(var),
|
||||
S::Sheep => v.push(DYE_NAMES[m.extra.color as usize & 15].into()),
|
||||
S::Horse => v.push(format!(
|
||||
"{}/{}",
|
||||
HORSE[m.extra.variant as usize % 7],
|
||||
MARKINGS[m.extra.variant2 as usize % 5]
|
||||
)),
|
||||
S::Llama | S::TraderLlama => v.push(format!(
|
||||
"{}/{}",
|
||||
horizon_client::mobs::llama::VARIANTS[m.extra.variant as usize % 4],
|
||||
m.extra.variant2
|
||||
)),
|
||||
S::SkeletonHorse => v.push(format!("trap={}", m.extra.trap)),
|
||||
S::Fox => v.push(if m.extra.variant == 1 { "snow" } else { "red" }.into()),
|
||||
S::Rabbit => v.push(RABBITS[m.extra.variant as usize % 6].into()),
|
||||
S::Parrot => v.push(PARROTS[m.extra.variant as usize % 5].into()),
|
||||
S::Axolotl => v.push(AXOLOTLS[m.extra.variant as usize % 5].into()),
|
||||
S::TropicalFish => {
|
||||
let p = u32::from(m.extra.variant);
|
||||
let pattern = if p < 6 { p << 8 } else { 1 | (p - 6) << 8 };
|
||||
let packed = (pattern & 0xFFFF)
|
||||
| (u32::from(m.extra.variant2) & 0xFF) << 16
|
||||
| (u32::from(m.extra.variant3) & 0xFF) << 24;
|
||||
v.push((packed as i32).to_string());
|
||||
}
|
||||
S::Salmon => v.push(SALMON[m.extra.variant as usize % 3].into()),
|
||||
S::Panda => v.push(format!(
|
||||
"{}/{}",
|
||||
GENES[m.extra.variant as usize % 7],
|
||||
GENES[m.extra.variant2 as usize % 7]
|
||||
)),
|
||||
S::Goat => v.push(format!(
|
||||
"scream={} horns={},{}",
|
||||
m.extra.screaming, !m.extra.lost_horns[0], !m.extra.lost_horns[1]
|
||||
)),
|
||||
S::Slime | S::MagmaCube | S::SulfurCube => v.push(format!("size={}", m.extra.size.max(1))),
|
||||
S::Villager => v.push(format!(
|
||||
"minecraft:{}/minecraft:{}/{}",
|
||||
VILLAGER_TYPES[m.extra.variant as usize % 7],
|
||||
PROFESSIONS[m.extra.variant2 as usize % PROFESSIONS.len()],
|
||||
m.extra.variant3.max(1)
|
||||
)),
|
||||
S::ZombieVillager => v.push(format!(
|
||||
"minecraft:{}/{}",
|
||||
VILLAGER_TYPES[m.extra.variant as usize % 7],
|
||||
m.extra.variant3.max(1)
|
||||
)),
|
||||
S::Phantom => v.push(format!("size={}", m.extra.size)),
|
||||
S::Turtle => v.push(format!(
|
||||
"home={}",
|
||||
m.extra
|
||||
.home
|
||||
.map_or("-".into(), |h| format!("{},{},{}", h[0], h[1], h[2]))
|
||||
)),
|
||||
S::Dolphin => v.push(format!("air={}", m.air)),
|
||||
_ => {}
|
||||
}
|
||||
if matches!(
|
||||
s,
|
||||
S::Zombie | S::Husk | S::Drowned | S::ZombieVillager | S::ZombifiedPiglin
|
||||
) {
|
||||
v.push(format!("doors={}", m.extra.can_break_doors));
|
||||
}
|
||||
if horizon_client::mobs::raider::is_raider(s) {
|
||||
let st = horizon_client::mobs::raider::state(m);
|
||||
v.push(format!(
|
||||
"leader={} patrolling={}",
|
||||
st.is_some_and(|s| s.patrol_leader),
|
||||
st.is_some_and(|s| s.patrolling)
|
||||
));
|
||||
v.push(format!("raid={}", st.is_some_and(|s| s.can_join_raid)));
|
||||
}
|
||||
if s == S::Strider {
|
||||
v.push(format!("saddled={}", m.extra.saddled));
|
||||
}
|
||||
}
|
||||
|
||||
fn describe(m: &Mob, all: &[Mob], regs: &SpawnRegistries) -> String {
|
||||
let mut t = vec![m.kind.id.clone()];
|
||||
let vehicle = m
|
||||
.extra
|
||||
.mount
|
||||
.and_then(|v| all.iter().position(|o| o.id == v))
|
||||
.map_or("-".to_owned(), |i| i.to_string());
|
||||
t.push(format!("veh={vehicle}"));
|
||||
if finalize::ageable(m.species()) {
|
||||
t.push(format!("age={}", m.extra.age));
|
||||
} else {
|
||||
t.push(format!("baby={}", m.is_baby()));
|
||||
}
|
||||
t.push(format!("hp={}", hex32(m.health)));
|
||||
t.push(format!("lh={}", m.extra.left_handed));
|
||||
t.push(format!("loot={}", m.can_pick_up_loot()));
|
||||
t.push(format!("persist={}", m.persistent));
|
||||
let mut eq = Vec::new();
|
||||
for (slot, name) in finalize::SLOT_NAMES.iter().enumerate() {
|
||||
let Some(id) = finalize::item(m, slot) else {
|
||||
continue;
|
||||
};
|
||||
let mut text = id.to_string();
|
||||
let g = match slot {
|
||||
0 => Some(gear::MAIN),
|
||||
1 => Some(gear::OFF),
|
||||
2 => Some(gear::FEET),
|
||||
3 => Some(gear::LEGS),
|
||||
4 => Some(gear::CHEST),
|
||||
5 => Some(gear::HEAD),
|
||||
_ => None,
|
||||
};
|
||||
if let (Some(g), Some(levels)) = (g, gear::gear(m)) {
|
||||
let mut list: Vec<String> = levels.slots[g]
|
||||
.iter()
|
||||
.map(|(e, l)| format!("{e}={l}"))
|
||||
.collect();
|
||||
list.sort();
|
||||
if !list.is_empty() {
|
||||
let _ = write!(text, "[{}]", list.join(","));
|
||||
}
|
||||
}
|
||||
if slot == 5 && horizon_client::mobs::raider::is_captain(m) {
|
||||
text.push_str("*4");
|
||||
}
|
||||
eq.push(format!("{name}:{text}"));
|
||||
}
|
||||
t.push(format!(
|
||||
"eq={}",
|
||||
if eq.is_empty() {
|
||||
"-".into()
|
||||
} else {
|
||||
eq.join(";")
|
||||
}
|
||||
));
|
||||
let drops: Vec<String> = finalize::SLOT_NAMES
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(i, name)| {
|
||||
let d = finalize::stored_drop_chance(m, i);
|
||||
(d != 0.085).then(|| format!("{name}:{}", hex32(d)))
|
||||
})
|
||||
.collect();
|
||||
t.push(format!(
|
||||
"drop={}",
|
||||
if drops.is_empty() {
|
||||
"-".into()
|
||||
} else {
|
||||
drops.join(";")
|
||||
}
|
||||
));
|
||||
let attrs: Vec<String> = [
|
||||
Attr::MaxHealth,
|
||||
Attr::MovementSpeed,
|
||||
Attr::FollowRange,
|
||||
Attr::AttackDamage,
|
||||
Attr::KnockbackResistance,
|
||||
Attr::SpawnReinforcements,
|
||||
Attr::JumpStrength,
|
||||
]
|
||||
.into_iter()
|
||||
.filter(|a| finalize::default_value(m, *a).is_some())
|
||||
.map(|a| format!("{}:{}", a.name(), hex64(finalize::value(m, a))))
|
||||
.collect();
|
||||
t.push(format!("a={}", attrs.join(",")));
|
||||
let mut fx: Vec<String> = m
|
||||
.extra
|
||||
.effects
|
||||
.iter()
|
||||
.map(|(e, d, a)| format!("{e}:{a}:{d}"))
|
||||
.collect();
|
||||
fx.sort();
|
||||
t.push(format!(
|
||||
"fx={}",
|
||||
if fx.is_empty() {
|
||||
"-".into()
|
||||
} else {
|
||||
fx.join(",")
|
||||
}
|
||||
));
|
||||
let mem: Vec<String> = MEMORIES
|
||||
.iter()
|
||||
.filter_map(|name| {
|
||||
let (_, value, ttl) = m.extra.memories.iter().find(|x| x.0 == *name)?;
|
||||
let text = match *name {
|
||||
"hunted_recently" => "true".to_owned(),
|
||||
"dig_cooldown" | "is_emerging" => "INSTANCE".to_owned(),
|
||||
"home" => m
|
||||
.extra
|
||||
.home
|
||||
.map_or("-".into(), |h| format!("{},{},{}", h[0], h[1], h[2])),
|
||||
_ => value.to_string(),
|
||||
};
|
||||
Some(format!("{name}:{text}:{ttl}"))
|
||||
})
|
||||
.collect();
|
||||
if !mem.is_empty() {
|
||||
t.push(format!("mem={}", mem.join(",")));
|
||||
}
|
||||
let mut v = Vec::new();
|
||||
variant(m, regs, &mut v);
|
||||
if !v.is_empty() {
|
||||
t.push(format!("v={}", v.join(" ").replace(' ', "_")));
|
||||
}
|
||||
t.join(" ")
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let root = Path::new(
|
||||
args.get(1)
|
||||
.ok_or("usage: finalize_spawn_fixture RESOURCES INPUT OUTPUT HALLOWEEN")?,
|
||||
);
|
||||
let input = fs::read_to_string(args.get(2).ok_or("missing INPUT")?)?;
|
||||
let halloween = args.get(4).is_some_and(|h| h == "true");
|
||||
let assets = Assets::load(root)?;
|
||||
let facts = BlockFacts::load(root, assets.registry)?;
|
||||
let mob_data = MobData::load(root, &facts);
|
||||
let items = Items::tags_only(root)?;
|
||||
let enchantments = Enchantments::load(root);
|
||||
let types = MobTypes::load(root)?;
|
||||
let registries = SpawnRegistries::load(root);
|
||||
let camel = &types.types["minecraft:camel_husk"];
|
||||
let data = SpawnData {
|
||||
registries: ®istries,
|
||||
enchantments: &enchantments,
|
||||
items: &items,
|
||||
camel_husk_size: (camel.width as f32, camel.height as f32),
|
||||
};
|
||||
let mut out = format!("halloween {halloween}\n");
|
||||
for line in input.lines().filter(|l| !l.trim().is_empty()) {
|
||||
let mut c: HashMap<&str, &str> = HashMap::new();
|
||||
let mut name = "";
|
||||
for token in line.split_whitespace() {
|
||||
match token.split_once('=') {
|
||||
Some((k, v)) => {
|
||||
c.insert(k, v);
|
||||
}
|
||||
None => name = token,
|
||||
}
|
||||
}
|
||||
let get =
|
||||
|k: &str, d: &'static str| -> String { c.get(k).copied().unwrap_or(d).to_owned() };
|
||||
let p: Vec<f64> = get("pos", "0,0,0")
|
||||
.split(',')
|
||||
.map(|x| x.parse().unwrap_or(0.0))
|
||||
.collect();
|
||||
let pos = Vec3::new(p[0], p[1], p[2]);
|
||||
let block = [
|
||||
p[0].floor() as i32,
|
||||
p[1].floor() as i32,
|
||||
p[2].floor() as i32,
|
||||
];
|
||||
let base = match get("difficulty", "normal").as_str() {
|
||||
"peaceful" => 0,
|
||||
"easy" => 1,
|
||||
"hard" => 3,
|
||||
_ => 2,
|
||||
};
|
||||
let phase: usize = get("phase", "0").parse().unwrap_or(0);
|
||||
let time: i64 = get("time", "0").parse().unwrap_or(0);
|
||||
let inhabited: i64 = get("inhabited", "0").parse().unwrap_or(0);
|
||||
let difficulty = LocalDifficulty::new(
|
||||
base,
|
||||
time,
|
||||
inhabited,
|
||||
horizon_client::mobs::spawning::MOON_BRIGHTNESS[phase & 7],
|
||||
);
|
||||
let mut level = Level {
|
||||
types: &types,
|
||||
data: &mob_data,
|
||||
biome: get("biome", "minecraft:plains"),
|
||||
structure: c.get("structure").map(|s| {
|
||||
(
|
||||
(*s).to_owned(),
|
||||
[
|
||||
block[0] - 8,
|
||||
block[1] - 8,
|
||||
block[2] - 8,
|
||||
block[0] + 8,
|
||||
block[1] + 8,
|
||||
block[2] + 8,
|
||||
],
|
||||
)
|
||||
}),
|
||||
phase,
|
||||
monsters: get("monsters", "1") != "0",
|
||||
peaceful: base == 0,
|
||||
time,
|
||||
halloween,
|
||||
roof: c
|
||||
.get("roof")
|
||||
.and_then(|r| r.parse::<i32>().ok())
|
||||
.map(|r| block[1] + r),
|
||||
eseed: get("eseed", "0").parse().unwrap_or(0),
|
||||
created: 0,
|
||||
chickens: Vec::new(),
|
||||
rides: Vec::new(),
|
||||
};
|
||||
let mut all: Vec<Mob> = Vec::new();
|
||||
let chickens: usize = get("chickens", "0").parse().unwrap_or(0);
|
||||
for i in 0..chickens {
|
||||
if let Some(mut chicken) = level.create("minecraft:chicken", Reason::Load) {
|
||||
chicken.position = Vec3::new(pos.x + i as f64, pos.y, pos.z);
|
||||
level.chickens.push((chicken.id, chicken.bounds(), false));
|
||||
all.push(chicken);
|
||||
}
|
||||
}
|
||||
let kind = get("type", "minecraft:pig");
|
||||
let reason = Reason::parse(&get("reason", "NATURAL")).unwrap_or(Reason::Natural);
|
||||
let pack: usize = get("pack", "1").parse().unwrap_or(1);
|
||||
let mut random = LegacyRandom::new(get("seed", "0").parse().unwrap_or(0));
|
||||
let mut group = None;
|
||||
for _ in 0..pack {
|
||||
let Some(mut mob) = level.create(&kind, reason) else {
|
||||
break;
|
||||
};
|
||||
mob.position = pos;
|
||||
mob.previous = pos;
|
||||
let mut cx = Ctx {
|
||||
level: &mut level,
|
||||
random: &mut random,
|
||||
difficulty,
|
||||
data: &data,
|
||||
created: Vec::new(),
|
||||
};
|
||||
group = finalize::finalize(&mut cx, &mut mob, reason, group);
|
||||
let created = std::mem::take(&mut cx.created);
|
||||
all.push(mob);
|
||||
all.extend(created);
|
||||
}
|
||||
for (chicken, rider) in std::mem::take(&mut level.rides) {
|
||||
if let Some(c) = all.iter_mut().find(|m| m.id == chicken) {
|
||||
c.extra.jockey = true;
|
||||
c.extra.rider = Some(rider);
|
||||
}
|
||||
}
|
||||
all.sort_by_key(|m| m.id);
|
||||
let mut parts: Vec<String> = all.iter().map(|m| describe(m, &all, ®istries)).collect();
|
||||
for m in &mut all {
|
||||
parts.push(format!("rng {}", m.random.next_long()));
|
||||
}
|
||||
parts.push(format!("next {}", random.next_long()));
|
||||
let _ = writeln!(out, "{name} {}", parts.join(" | "));
|
||||
}
|
||||
fs::write(args.get(3).ok_or("missing OUTPUT")?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
//! The ghost recipe a recipe book click fades into the menu, for
|
||||
//! tools/test_ghost_recipe_parity.py: reads one JSON case per line (menu, recipe
|
||||
//! id, the stack in the furnace's fuel slot) and prints, for every display of
|
||||
//! the recipe, the slots `Book::ghost` fills and the stacks each cycles through.
|
||||
//!
|
||||
//! usage: ghost_recipe_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::{
|
||||
crafting::Recipes,
|
||||
item_data::{canon_stack, parse_stack},
|
||||
items::Items,
|
||||
recipe_book::{Book, BookType, GhostTarget, RecipeIndex},
|
||||
};
|
||||
use serde_json::Value;
|
||||
use std::{fmt::Write as _, fs, path::Path};
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: ghost_recipe_fixture RESOURCES CASES OUTPUT";
|
||||
let root = Path::new(args.get(1).ok_or(usage)?);
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let index = RecipeIndex::load(root);
|
||||
let mut book = Book::build(&recipes, &items);
|
||||
book.set_display_ids(&index);
|
||||
let mut out = String::new();
|
||||
for line in cases.lines() {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let menu = case["menu"].as_str().unwrap_or_default();
|
||||
let id = case["recipe"].as_str().unwrap_or_default();
|
||||
let (book_type, grid) = match menu {
|
||||
"inventory" => (BookType::Crafting, 2),
|
||||
"crafting" => (BookType::Crafting, 3),
|
||||
"furnace" => (BookType::Furnace, 0),
|
||||
"blast_furnace" => (BookType::BlastFurnace, 0),
|
||||
_ => (BookType::Smoker, 0),
|
||||
};
|
||||
let fuel = match case["fuel"].as_str() {
|
||||
Some(s) => parse_stack(s)?,
|
||||
None => None,
|
||||
};
|
||||
for entry in book.entries.iter().filter(|e| e.id == id) {
|
||||
let crafting = book_type == BookType::Crafting;
|
||||
let is_furnace = matches!(
|
||||
entry.display,
|
||||
horizon_client::recipe_book::Display::Furnace(_)
|
||||
);
|
||||
if is_furnace == crafting || (crafting && !entry.fits(grid, grid)) {
|
||||
out.push_str("skip | ");
|
||||
continue;
|
||||
}
|
||||
for slot in book.ghost(entry, book_type, grid, fuel.is_none(), &items) {
|
||||
let (index, result) = match slot.target {
|
||||
GhostTarget::Result => (if crafting { 0 } else { 2 }, true),
|
||||
GhostTarget::Grid(i) => (1 + i, false),
|
||||
GhostTarget::Input => (0, false),
|
||||
GhostTarget::Fuel => (1, false),
|
||||
};
|
||||
let stacks: Vec<String> = slot.items.iter().map(|s| canon_stack(Some(s))).collect();
|
||||
let _ = write!(
|
||||
out,
|
||||
"{index}{}={} ",
|
||||
if result { "R" } else { "I" },
|
||||
stacks.join(",")
|
||||
);
|
||||
}
|
||||
out.push_str("| ");
|
||||
}
|
||||
out.push('\n');
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
//! Creative toolbars read through the data fixers, for
|
||||
//! tools/test_hotbar_parity.py: reads one JSON case per line (the SNBT of a
|
||||
//! `hotbar.nbt`, or null for a missing file) and prints the stacks of the nine
|
||||
//! rows after `horizon_client::hotbar::from_tag`.
|
||||
//!
|
||||
//! usage: hotbar_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::{hotbar, item_data::canon_stack, items::Items};
|
||||
use horizon_world::nbt::{Tag, parse_snbt};
|
||||
use serde_json::Value;
|
||||
use std::path::Path;
|
||||
use std::{fmt::Write as _, fs};
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: hotbar_fixture RESOURCES CASES OUTPUT";
|
||||
let items = Items::catalog(Path::new(args.first().and(args.get(1)).ok_or(usage)?))?;
|
||||
let known = |id: &str| items.get(id).is_some();
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let mut out = String::new();
|
||||
for line in cases.lines() {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let rows = match case["snbt"].as_str() {
|
||||
Some(text) => match parse_snbt(text) {
|
||||
Ok((tag @ Tag::Compound(_), _)) => hotbar::from_tag(tag, &known),
|
||||
_ => return Err("case snbt".into()),
|
||||
},
|
||||
None => (0..hotbar::GROUPS)
|
||||
.map(|_| vec![None; hotbar::SIZE])
|
||||
.collect(),
|
||||
};
|
||||
for (i, row) in rows.iter().enumerate() {
|
||||
let _ = write!(out, "{i}:");
|
||||
for stack in row {
|
||||
let _ = write!(out, " {}", canon_stack(stack.as_ref()));
|
||||
}
|
||||
out.push_str(" | ");
|
||||
}
|
||||
out.push('\n');
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
//! Headless transport for the HUD parity gate: replays each player state
|
||||
//! through `horizon_client::hud_layout` (crosshair, hotbar, health, mount
|
||||
//! hearts, experience bar and level) and writes the draw calls in vanilla's
|
||||
//! GuiGraphicsExtractor terms.
|
||||
//! Headless transport for the HUD parity gate: replays each case through
|
||||
//! `horizon_client::hud_layout` and writes the draw calls in vanilla's
|
||||
//! GuiGraphicsExtractor terms. Case kinds: `decorations` (crosshair,
|
||||
//! hotbar, health, mount hearts, experience bar and level) and the
|
||||
//! overlays handled in `kinds`.
|
||||
#![forbid(unsafe_code)]
|
||||
use horizon_client::{
|
||||
hud::{HudAtlas, HudBatch},
|
||||
hud_layout::{self, GuiDraw, HealthHud, HealthInputs, HeartKind, HotbarInputs},
|
||||
hud_layout::{self, GuiDraw, HealthHud, HealthInputs, HeartKind, HotbarInputs, IDENTITY, Pose},
|
||||
lang,
|
||||
text::Text,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{
|
||||
@@ -14,6 +17,8 @@ use std::{
|
||||
path::PathBuf,
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
#[path = "hud_fixture/kinds.rs"]
|
||||
mod kinds;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
@@ -21,123 +26,245 @@ fn main() -> Result<()> {
|
||||
return Err("usage: hud_fixture RESOURCES INPUTS OUTPUT".into());
|
||||
};
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
lang::set(lang::Language::load(&[root], lang::DEFAULT));
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let int = |k: &str, d: i64| c[k].as_i64().unwrap_or(d) as i32;
|
||||
let float = |k: &str, d: f64| c[k].as_f64().unwrap_or(d) as f32;
|
||||
let (w, h) = (int("width", 0), int("height", 0));
|
||||
let mode = c["gameMode"].as_str().unwrap_or("survival");
|
||||
let survival = mode == "survival" || mode == "adventure";
|
||||
let indicator = c["attackIndicator"].as_str().unwrap_or("OFF");
|
||||
let partial = float("partial", 0.0);
|
||||
let effects: Vec<&str> = c["effects"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(Value::as_str)
|
||||
.collect();
|
||||
let has = |e: &str| effects.contains(&e);
|
||||
let mut draws = Vec::new();
|
||||
// Spectators only see it over a spectatable target (none here).
|
||||
if c["crosshair"].as_bool().unwrap_or(false) && mode != "spectator" {
|
||||
let attack = (indicator == "CROSSHAIR").then(|| float("attackScale", 1.0));
|
||||
draws.extend(hud_layout::crosshair(w, h, attack, false));
|
||||
}
|
||||
if mode != "spectator" {
|
||||
let pop = |v: &Value| v.as_f64().map(|p| p as f32 - partial);
|
||||
let slots: [Option<f32>; 9] = std::array::from_fn(|i| pop(&c["slots"][i]));
|
||||
let inputs = HotbarInputs {
|
||||
selected: int("selected", 0),
|
||||
right_handed: c["rightHanded"].as_bool().unwrap_or(true),
|
||||
offhand: !c["offhand"].is_null(),
|
||||
slots,
|
||||
offhand_pop: pop(&c["offhand"]).unwrap_or(0.0),
|
||||
attack: (indicator == "HOTBAR").then(|| float("attackScale", 1.0)),
|
||||
};
|
||||
draws.extend(hud_layout::hotbar(w, h, &inputs));
|
||||
}
|
||||
let vehicle_hearts = if c.get("vehicleMaxHealth").is_some() {
|
||||
hud_layout::vehicle_max_hearts(float("vehicleMaxHealth", 0.0))
|
||||
} else {
|
||||
0
|
||||
// State the case reads back besides the draws (e.g. `scopeScale`).
|
||||
let mut state = serde_json::Map::new();
|
||||
let draws = match c["kind"].as_str().unwrap_or("decorations") {
|
||||
"decorations" => decorations(&c, &atlas),
|
||||
kind => kinds::run(kind, &c, &atlas, &mut state),
|
||||
};
|
||||
if survival {
|
||||
let millis = 1_000_000_000i64;
|
||||
let mut hud = HealthHud {
|
||||
last_health: int("lastHealth", 0),
|
||||
display_health: int("displayHealth", 0),
|
||||
last_health_time: millis - i64::from(int("lastHealthAgo", 0)),
|
||||
health_blink_time: i64::from(int("healthBlinkTime", 0)),
|
||||
};
|
||||
let kind = if has("minecraft:poison") {
|
||||
HeartKind::Poisoned
|
||||
} else if has("minecraft:wither") {
|
||||
HeartKind::Withered
|
||||
} else if c["frozen"].as_bool().unwrap_or(false) {
|
||||
HeartKind::Frozen
|
||||
} else {
|
||||
HeartKind::Normal
|
||||
};
|
||||
let inputs = HealthInputs {
|
||||
tick: int("tick", 0),
|
||||
millis,
|
||||
health: float("health", 20.0),
|
||||
max_health: float("maxHealth", 20.0),
|
||||
absorption: float("absorption", 0.0),
|
||||
armor: int("armor", 0),
|
||||
food: int("food", 20),
|
||||
saturation: float("saturation", 5.0),
|
||||
kind,
|
||||
regeneration: has("minecraft:regeneration"),
|
||||
hunger: has("minecraft:hunger"),
|
||||
hardcore: c["hardcore"].as_bool().unwrap_or(false),
|
||||
damage_cooldown: int("damageCooldown", 0) > 0,
|
||||
air: int("air", 300),
|
||||
max_air: int("maxAir", 300),
|
||||
under_water: c["underWater"].as_bool().unwrap_or(false),
|
||||
vehicle_hearts,
|
||||
};
|
||||
draws.extend(hud.layout(&inputs, w, h));
|
||||
}
|
||||
if vehicle_hearts > 0 {
|
||||
draws.extend(hud_layout::vehicle_health(
|
||||
w,
|
||||
h,
|
||||
vehicle_hearts,
|
||||
float("vehicleHealth", 0.0),
|
||||
));
|
||||
}
|
||||
let width = |s: &str| HudBatch::text_width(&atlas, s) as i32;
|
||||
let level = if survival { int("xpLevel", 0) } else { 0 };
|
||||
draws.extend(hud_layout::experience(
|
||||
w,
|
||||
h,
|
||||
float("xpProgress", 0.0),
|
||||
level,
|
||||
c["experienceBar"].as_bool().unwrap_or(false),
|
||||
&width,
|
||||
));
|
||||
let draws: Vec<Value> = draws
|
||||
.iter()
|
||||
.map(|d| match d {
|
||||
GuiDraw::Sprite { sprite, x, y, w, h, region } => {
|
||||
json!({"type": "sprite", "sprite": sprite, "x": x, "y": y, "w": w, "h": h, "region": region})
|
||||
}
|
||||
GuiDraw::Text { text, x, y, color, shadow } => {
|
||||
json!({"type": "text", "text": text, "x": x, "y": y, "color": *color as i32, "shadow": shadow})
|
||||
}
|
||||
GuiDraw::Item { slot, x, y, seed, scale, pivot } => {
|
||||
// translate(pivot) * scale * translate(-pivot) as a 3x2 matrix.
|
||||
let m = [scale[0], 0.0, 0.0, scale[1], pivot[0] - pivot[0] * scale[0], pivot[1] - pivot[1] * scale[1]];
|
||||
json!({"type": "item", "slot": slot, "x": x, "y": y, "seed": seed, "matrix": m})
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
writeln!(out, "{}", json!({ "draws": draws }))?;
|
||||
state.insert("draws".into(), json!(encode(&draws)));
|
||||
writeln!(out, "{}", Value::Object(state))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Style runs of styled text: `[text, rgb|null, bold, italic]` per run of
|
||||
/// equally styled characters, or none for plain text.
|
||||
fn runs(t: &Text) -> Option<Value> {
|
||||
let mut out: Vec<(String, Option<u32>, bool, bool)> = Vec::new();
|
||||
let mut styled = false;
|
||||
for (ch, s) in t.chars() {
|
||||
let key = (s.color, s.is_bold(), s.is_italic());
|
||||
styled |= key != (None, false, false);
|
||||
match out.last_mut() {
|
||||
Some(last) if (last.1, last.2, last.3) == key => last.0.push(ch),
|
||||
_ => out.push((ch.to_string(), key.0, key.1, key.2)),
|
||||
}
|
||||
}
|
||||
styled.then(|| {
|
||||
json!(
|
||||
out.into_iter()
|
||||
.map(|r| json!([r.0, r.1, r.2, r.3]))
|
||||
.collect::<Vec<_>>()
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
fn encode(draws: &[GuiDraw]) -> Vec<Value> {
|
||||
let mut stack: Vec<Pose> = vec![IDENTITY];
|
||||
let mut out = Vec::new();
|
||||
for d in draws {
|
||||
let pose = *stack.last().unwrap();
|
||||
let mut v = match d {
|
||||
GuiDraw::Push(ops) => {
|
||||
let mut m = pose;
|
||||
for op in ops {
|
||||
hud_layout::pose_apply(&mut m, *op);
|
||||
}
|
||||
stack.push(m);
|
||||
continue;
|
||||
}
|
||||
GuiDraw::Pop => {
|
||||
stack.pop();
|
||||
continue;
|
||||
}
|
||||
GuiDraw::Sprite {
|
||||
sprite,
|
||||
x,
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
region,
|
||||
color,
|
||||
} => {
|
||||
json!({"type": "sprite", "sprite": sprite, "x": x, "y": y, "w": w, "h": h, "region": region, "color": *color as i32})
|
||||
}
|
||||
GuiDraw::AtlasSprite {
|
||||
sprite,
|
||||
x,
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
color,
|
||||
} => {
|
||||
json!({"type": "atlas", "sprite": sprite, "x": x, "y": y, "w": w, "h": h, "color": *color as i32})
|
||||
}
|
||||
GuiDraw::Blit {
|
||||
texture,
|
||||
blend,
|
||||
x,
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
uv,
|
||||
src,
|
||||
tex,
|
||||
color,
|
||||
} => json!({
|
||||
"type": "blit", "texture": format!("textures/{texture}.png"), "pipeline": blend.pipeline(),
|
||||
"x": x, "y": y, "w": w, "h": h, "uv": uv, "src": src, "tex": tex, "color": *color as i32}),
|
||||
GuiDraw::Fill {
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
y1,
|
||||
color,
|
||||
} => {
|
||||
json!({"type": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1, "color": *color as i32})
|
||||
}
|
||||
GuiDraw::Text {
|
||||
text,
|
||||
x,
|
||||
y,
|
||||
color,
|
||||
shadow,
|
||||
} => {
|
||||
let mut v = json!({"type": "text", "text": text.plain(), "x": x, "y": y, "color": *color as i32, "shadow": shadow});
|
||||
if let Some(r) = runs(text) {
|
||||
v["runs"] = r;
|
||||
}
|
||||
v
|
||||
}
|
||||
GuiDraw::Item {
|
||||
slot,
|
||||
x,
|
||||
y,
|
||||
seed,
|
||||
scale,
|
||||
pivot,
|
||||
} => {
|
||||
// translate(pivot) * scale * translate(-pivot) as a 3x2 matrix.
|
||||
let m = [
|
||||
scale[0],
|
||||
0.0,
|
||||
0.0,
|
||||
scale[1],
|
||||
pivot[0] - pivot[0] * scale[0],
|
||||
pivot[1] - pivot[1] * scale[1],
|
||||
];
|
||||
out.push(json!({"type": "item", "slot": slot, "x": x, "y": y, "seed": seed, "matrix": m}));
|
||||
continue;
|
||||
}
|
||||
};
|
||||
if pose != IDENTITY {
|
||||
v["matrix"] = json!(pose);
|
||||
}
|
||||
out.push(v);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn decorations(c: &Value, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let int = |k: &str, d: i64| c[k].as_i64().unwrap_or(d) as i32;
|
||||
let float = |k: &str, d: f64| c[k].as_f64().unwrap_or(d) as f32;
|
||||
let (w, h) = (int("width", 0), int("height", 0));
|
||||
let mode = c["gameMode"].as_str().unwrap_or("survival");
|
||||
let survival = mode == "survival" || mode == "adventure";
|
||||
let indicator = c["attackIndicator"].as_str().unwrap_or("OFF");
|
||||
let partial = float("partial", 0.0);
|
||||
let effects: Vec<&str> = c["effects"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(Value::as_str)
|
||||
.collect();
|
||||
let has = |e: &str| effects.contains(&e);
|
||||
let mut draws = Vec::new();
|
||||
// Spectators only see it over a spectatable target (none here).
|
||||
if c["crosshair"].as_bool().unwrap_or(false) && mode != "spectator" {
|
||||
let attack = (indicator == "CROSSHAIR").then(|| float("attackScale", 1.0));
|
||||
draws.extend(hud_layout::crosshair(w, h, attack, false));
|
||||
}
|
||||
if mode != "spectator" {
|
||||
let pop = |v: &Value| v.as_f64().map(|p| p as f32 - partial);
|
||||
let slots: [Option<f32>; 9] = std::array::from_fn(|i| pop(&c["slots"][i]));
|
||||
let inputs = HotbarInputs {
|
||||
selected: int("selected", 0),
|
||||
right_handed: c["rightHanded"].as_bool().unwrap_or(true),
|
||||
offhand: !c["offhand"].is_null(),
|
||||
slots,
|
||||
offhand_pop: pop(&c["offhand"]).unwrap_or(0.0),
|
||||
attack: (indicator == "HOTBAR").then(|| float("attackScale", 1.0)),
|
||||
};
|
||||
draws.extend(hud_layout::hotbar(w, h, &inputs));
|
||||
}
|
||||
let vehicle_hearts = if c.get("vehicleMaxHealth").is_some() {
|
||||
hud_layout::vehicle_max_hearts(float("vehicleMaxHealth", 0.0))
|
||||
} else {
|
||||
0
|
||||
};
|
||||
if survival {
|
||||
let millis = 1_000_000_000i64;
|
||||
let mut hud = HealthHud {
|
||||
last_health: int("lastHealth", 0),
|
||||
display_health: int("displayHealth", 0),
|
||||
last_health_time: millis - i64::from(int("lastHealthAgo", 0)),
|
||||
health_blink_time: i64::from(int("healthBlinkTime", 0)),
|
||||
};
|
||||
let kind = if has("minecraft:poison") {
|
||||
HeartKind::Poisoned
|
||||
} else if has("minecraft:wither") {
|
||||
HeartKind::Withered
|
||||
} else if c["frozen"].as_bool().unwrap_or(false) {
|
||||
HeartKind::Frozen
|
||||
} else {
|
||||
HeartKind::Normal
|
||||
};
|
||||
let inputs = HealthInputs {
|
||||
tick: int("tick", 0),
|
||||
millis,
|
||||
health: float("health", 20.0),
|
||||
max_health: float("maxHealth", 20.0),
|
||||
absorption: float("absorption", 0.0),
|
||||
armor: int("armor", 0),
|
||||
food: int("food", 20),
|
||||
saturation: float("saturation", 5.0),
|
||||
kind,
|
||||
regeneration: has("minecraft:regeneration"),
|
||||
hunger: has("minecraft:hunger"),
|
||||
hardcore: c["hardcore"].as_bool().unwrap_or(false),
|
||||
damage_cooldown: int("damageCooldown", 0) > 0,
|
||||
air: int("air", 300),
|
||||
max_air: int("maxAir", 300),
|
||||
under_water: c["underWater"].as_bool().unwrap_or(false),
|
||||
vehicle_hearts,
|
||||
};
|
||||
draws.extend(hud.layout(&inputs, w, h));
|
||||
}
|
||||
if vehicle_hearts > 0 {
|
||||
draws.extend(hud_layout::vehicle_health(
|
||||
w,
|
||||
h,
|
||||
vehicle_hearts,
|
||||
float("vehicleHealth", 0.0),
|
||||
));
|
||||
}
|
||||
let width = |s: &str| HudBatch::text_width(atlas, s) as i32;
|
||||
let level = if survival { int("xpLevel", 0) } else { 0 };
|
||||
draws.extend(hud_layout::experience(
|
||||
w,
|
||||
h,
|
||||
float("xpProgress", 0.0),
|
||||
level,
|
||||
c["experienceBar"].as_bool().unwrap_or(false),
|
||||
&width,
|
||||
));
|
||||
draws
|
||||
}
|
||||
@@ -0,0 +1,330 @@
|
||||
//! The overlay case kinds of the HUD parity fixture.
|
||||
use horizon_client::{
|
||||
brewing,
|
||||
chat::{Chat, ChatOptions},
|
||||
component,
|
||||
hud::HudAtlas,
|
||||
hud_layout::{self, GuiDraw},
|
||||
hud_overlays::{
|
||||
self, BossBar, CameraOverlays, EffectIcon, HeldName, ItemDecorations, Titles, ToolHighlight,
|
||||
},
|
||||
scoreboard::{NumberFormat, RenderType, Scoreboard},
|
||||
text::{self, Text},
|
||||
};
|
||||
use serde_json::Value;
|
||||
|
||||
fn int(c: &Value, k: &str, d: i64) -> i32 {
|
||||
c[k].as_i64().unwrap_or(d) as i32
|
||||
}
|
||||
fn float(c: &Value, k: &str, d: f64) -> f32 {
|
||||
c[k].as_f64().unwrap_or(d) as f32
|
||||
}
|
||||
/// A text component in its JSON form.
|
||||
fn comp(v: &Value) -> Text {
|
||||
component::to_text(v, &mut |s| Text::literal(s))
|
||||
}
|
||||
/// `Options.getBackgroundColor(0.0F)` from the case's text background options.
|
||||
fn background(c: &Value) -> u32 {
|
||||
hud_layout::background_color(
|
||||
c["chatOnly"].as_bool().unwrap_or(true),
|
||||
c["textOpacity"].as_f64().unwrap_or(0.5),
|
||||
0.0,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn run(
|
||||
kind: &str,
|
||||
c: &Value,
|
||||
atlas: &HudAtlas,
|
||||
state: &mut serde_json::Map<String, Value>,
|
||||
) -> Vec<GuiDraw> {
|
||||
let (w, h) = (int(c, "width", 0), int(c, "height", 0));
|
||||
match kind {
|
||||
"effects" => effects(c, w),
|
||||
"title" => title(c, w, h, atlas),
|
||||
"selected" => selected(c, w, h, atlas),
|
||||
"boss" => boss(c, w, h, atlas),
|
||||
"jump" => hud_overlays::jump_bar(w, h, int(c, "cooldown", 0), float(c, "jumpScale", 0.0)),
|
||||
"sidebar" => sidebar(c, w, h, atlas),
|
||||
"decor" => decor(c, atlas),
|
||||
"overlays" => overlays(c, w, h, state),
|
||||
"chat" => chat(c, h, atlas),
|
||||
_ => Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn effects(c: &Value, w: i32) -> Vec<GuiDraw> {
|
||||
let icons: Vec<EffectIcon> = c["active"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|e| {
|
||||
let id = e["id"]
|
||||
.as_str()
|
||||
.unwrap_or("")
|
||||
.trim_start_matches("minecraft:");
|
||||
let def = brewing::effect(id).expect("effect");
|
||||
EffectIcon {
|
||||
id: id.to_owned(),
|
||||
beneficial: def.category == brewing::Category::Beneficial,
|
||||
color: def.color as i32,
|
||||
ambient: e["ambient"].as_bool().unwrap_or(false),
|
||||
duration: e["duration"].as_i64().unwrap_or(0) as i32,
|
||||
show_icon: e["icon"].as_bool().unwrap_or(true),
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
hud_overlays::effects(w, c["demo"].as_bool().unwrap_or(false), &icons)
|
||||
}
|
||||
|
||||
/// Replays `Hud.setTitle` / `setSubtitle` / `setTimes` / `clearTitles` /
|
||||
/// `resetTitleTimes` / `setOverlayMessage` and ticks, then extracts the
|
||||
/// action bar and the title.
|
||||
fn title(c: &Value, w: i32, h: i32, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let mut t = Titles::default();
|
||||
for op in c["ops"].as_array().into_iter().flatten() {
|
||||
let n = |i: usize| op[i].as_i64().unwrap_or(0) as i32;
|
||||
match op[0].as_str().unwrap_or("") {
|
||||
"title" => t.set_title(comp(&op[1])),
|
||||
"subtitle" => t.set_subtitle(comp(&op[1])),
|
||||
"times" => t.set_times(n(1), n(2), n(3)),
|
||||
"clear" => t.clear(),
|
||||
"reset" => t.reset_times(),
|
||||
"overlay" => t.set_overlay(comp(&op[1]), op[2].as_bool().unwrap_or(false)),
|
||||
"tick" => {
|
||||
for _ in 0..n(1) {
|
||||
t.tick();
|
||||
}
|
||||
}
|
||||
other => panic!("unknown title op {other}"),
|
||||
}
|
||||
}
|
||||
let partial = float(c, "partial", 0.0);
|
||||
let bg = background(c);
|
||||
let mut out = t.overlay_message(w, h, partial, &atlas.font, bg);
|
||||
out.extend(t.title(w, h, partial, &atlas.font, bg));
|
||||
out
|
||||
}
|
||||
|
||||
/// Ticks `toolHighlightTimer` through the selected stacks, then extracts the name.
|
||||
fn selected(c: &Value, w: i32, h: i32, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let mut highlight = ToolHighlight::default();
|
||||
let time = c["displayTime"].as_f64().unwrap_or(1.0);
|
||||
for step in c["steps"].as_array().into_iter().flatten() {
|
||||
let held = (!step.is_null()).then(|| {
|
||||
let custom = &step["custom"];
|
||||
HeldName {
|
||||
item: step["item"].as_str().unwrap_or("").to_owned(),
|
||||
hover_name: if custom.is_null() {
|
||||
Text::translate(step["key"].as_str().unwrap_or(""), &[])
|
||||
} else {
|
||||
comp(custom)
|
||||
},
|
||||
rarity_color: text::named_color(step["rarity"].as_str().unwrap_or("white"))
|
||||
.unwrap_or(0xFFFFFF),
|
||||
custom_name: !custom.is_null(),
|
||||
}
|
||||
});
|
||||
highlight.tick(held, time);
|
||||
}
|
||||
let mode = c["gameMode"].as_str().unwrap_or("survival");
|
||||
let can_hurt = mode == "survival" || mode == "adventure";
|
||||
highlight.draw(w, h, can_hurt, &atlas.font, background(c))
|
||||
}
|
||||
|
||||
fn boss(c: &Value, w: i32, h: i32, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let bars: Vec<BossBar> = c["bars"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|b| BossBar {
|
||||
name: comp(&b["name"]),
|
||||
progress: b["progress"].as_f64().unwrap_or(0.0) as f32,
|
||||
color: b["color"].as_u64().unwrap_or(0) as usize,
|
||||
overlay: b["overlay"].as_u64().unwrap_or(0) as usize,
|
||||
})
|
||||
.collect();
|
||||
hud_overlays::boss_overlay(w, h, &bars, &atlas.font)
|
||||
}
|
||||
|
||||
/// A `NumberFormat` from the case: null, `{type: blank}`, `{type: fixed,
|
||||
/// value}` or `{type: styled, style}`.
|
||||
fn number_format(v: &Value) -> Option<NumberFormat> {
|
||||
match v["type"].as_str()? {
|
||||
"blank" => Some(NumberFormat::Blank),
|
||||
"fixed" => Some(NumberFormat::Fixed(v["value"].clone())),
|
||||
"styled" => Some(NumberFormat::Styled(v["style"].clone())),
|
||||
other => panic!("unknown number format {other}"),
|
||||
}
|
||||
}
|
||||
|
||||
fn sidebar(c: &Value, w: i32, h: i32, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let mut board = Scoreboard::default();
|
||||
let o = &c["objective"];
|
||||
board.add_objective(
|
||||
"sidebar",
|
||||
"dummy",
|
||||
o["display"].clone(),
|
||||
RenderType::Integer,
|
||||
false,
|
||||
number_format(&o["format"]),
|
||||
);
|
||||
for s in c["scores"].as_array().into_iter().flatten() {
|
||||
let owner = s["owner"].as_str().unwrap_or("");
|
||||
let score = board.score_mut(owner, "sidebar");
|
||||
score.value = s["value"].as_i64().unwrap_or(0) as i32;
|
||||
score.display = (!s["display"].is_null()).then(|| s["display"].clone());
|
||||
score.number_format = number_format(&s["format"]);
|
||||
}
|
||||
for t in c["teams"].as_array().into_iter().flatten() {
|
||||
let name = t["name"].as_str().unwrap_or("");
|
||||
let team = board.add_team(name);
|
||||
team.prefix = t["prefix"].clone();
|
||||
team.suffix = t["suffix"].clone();
|
||||
team.color = t["color"].as_str().map(str::to_owned);
|
||||
for m in t["members"].as_array().into_iter().flatten() {
|
||||
board.add_to_team(m.as_str().unwrap_or(""), name);
|
||||
}
|
||||
}
|
||||
let opacity = c["textOpacity"].as_f64().unwrap_or(0.5);
|
||||
let chat_only = c["chatOnly"].as_bool().unwrap_or(true);
|
||||
let objective = board.objective("sidebar").expect("objective").clone();
|
||||
hud_overlays::sidebar(
|
||||
w,
|
||||
h,
|
||||
&board,
|
||||
&objective,
|
||||
&atlas.font,
|
||||
hud_layout::background_color(chat_only, opacity, 0.3),
|
||||
hud_layout::background_color(chat_only, opacity, 0.4),
|
||||
)
|
||||
}
|
||||
|
||||
/// `itemDecorations` for a stack with a count, damage and an item cooldown
|
||||
/// `elapsed` ticks into `duration` (ItemCooldowns.getCooldownPercent).
|
||||
fn decor(c: &Value, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let count = int(c, "count", 1);
|
||||
if count <= 0 {
|
||||
return Vec::new();
|
||||
}
|
||||
let cd = &c["cooldown"];
|
||||
let cooldown = if cd.is_null() {
|
||||
0.0
|
||||
} else {
|
||||
let (duration, elapsed) = (int(cd, "duration", 0), int(cd, "elapsed", 0));
|
||||
if duration <= elapsed {
|
||||
0.0 // ItemCooldowns.tick dropped it
|
||||
} else {
|
||||
let remaining = duration as f32 - (elapsed as f32 + float(c, "partial", 0.0));
|
||||
(remaining / duration as f32).clamp(0.0, 1.0)
|
||||
}
|
||||
};
|
||||
let max_damage = if c["unbreakable"].as_bool().unwrap_or(false) {
|
||||
0
|
||||
} else {
|
||||
int(c, "maxDamage", 0)
|
||||
};
|
||||
let d = ItemDecorations {
|
||||
count: count as u32,
|
||||
count_text: c["countText"].as_str().map(str::to_owned),
|
||||
bar: hud_overlays::damage_bar(int(c, "damage", 0), max_damage),
|
||||
cooldown,
|
||||
};
|
||||
hud_overlays::item_decorations(int(c, "x", 0), int(c, "y", 0), &d, &atlas.font)
|
||||
}
|
||||
|
||||
/// `Hud.extractCameraOverlays` then `extractSleepOverlay`; the border is
|
||||
/// static, so only its warning blocks matter.
|
||||
fn overlays(c: &Value, w: i32, h: i32, state: &mut serde_json::Map<String, Value>) -> Vec<GuiDraw> {
|
||||
let partial = float(c, "partial", 0.0);
|
||||
let warning = match &c["border"] {
|
||||
Value::Null => 0.0,
|
||||
b => {
|
||||
// WorldBorder.getDistanceToBorder with the static extent's clamped box.
|
||||
let max = 29_999_984.0;
|
||||
let half = b["size"].as_f64().unwrap_or(0.0) / 2.0;
|
||||
let (cx, cz) = (
|
||||
b["centerX"].as_f64().unwrap_or(0.0),
|
||||
b["centerZ"].as_f64().unwrap_or(0.0),
|
||||
);
|
||||
let (min_x, max_x) = ((cx - half).clamp(-max, max), (cx + half).clamp(-max, max));
|
||||
let (min_z, max_z) = ((cz - half).clamp(-max, max), (cz + half).clamp(-max, max));
|
||||
let (x, z) = (
|
||||
f64::from(float(c, "camX", 0.0)),
|
||||
f64::from(float(c, "camZ", 0.0)),
|
||||
);
|
||||
let distance = (x - min_x).min(max_x - x).min(z - min_z).min(max_z - z);
|
||||
hud_overlays::border_warning(
|
||||
distance as f32,
|
||||
int(b, "warningBlocks", 5),
|
||||
int(b, "warningTime", 15),
|
||||
0.0,
|
||||
0.0,
|
||||
)
|
||||
}
|
||||
};
|
||||
let ticks_frozen = int(c, "ticksFrozen", 0);
|
||||
let inputs = CameraOverlays {
|
||||
vignette: c["vignette"]
|
||||
.as_bool()
|
||||
.unwrap_or(false)
|
||||
.then(|| (float(c, "vignetteBrightness", 1.0), warning)),
|
||||
first_person: c["firstPerson"].as_bool().unwrap_or(false),
|
||||
scoping: c["scoping"].as_bool().unwrap_or(false),
|
||||
game_time_delta: partial,
|
||||
equipment: match c["head"].as_str() {
|
||||
Some("carved_pumpkin") => vec!["misc/pumpkinblur".to_owned()],
|
||||
_ => Vec::new(),
|
||||
},
|
||||
ticks_frozen,
|
||||
percent_frozen: ticks_frozen.min(140) as f32 / 140.0,
|
||||
partial,
|
||||
portal: [
|
||||
c["portal"][0].as_f64().unwrap_or(0.0) as f32,
|
||||
c["portal"][1].as_f64().unwrap_or(0.0) as f32,
|
||||
],
|
||||
nausea: float(c, "nausea", 0.0),
|
||||
screen_effect_scale: float(c, "screenEffectScale", 1.0),
|
||||
};
|
||||
let mut scope = float(c, "scopeScale", 0.5);
|
||||
let mut out = hud_overlays::camera_overlays(w, h, &inputs, &mut scope);
|
||||
out.extend(hud_overlays::sleep_overlay(w, h, int(c, "sleepTimer", 0)));
|
||||
state.insert("scopeScale".into(), serde_json::json!(scope));
|
||||
out
|
||||
}
|
||||
|
||||
/// Messages added at their ticks (`Hud.tickCount`), then the chat in
|
||||
/// background mode at tick `now`.
|
||||
fn chat(c: &Value, h: i32, atlas: &HudAtlas) -> Vec<GuiDraw> {
|
||||
let option = |k: &str| c[k].as_f64().unwrap_or(0.0);
|
||||
let mut chat = Chat::default();
|
||||
chat.options = ChatOptions {
|
||||
opacity: option("chatOpacity"),
|
||||
background_opacity: option("textOpacity"),
|
||||
scale: option("chatScale"),
|
||||
width: option("chatWidth"),
|
||||
height_focused: option("chatHeightFocused"),
|
||||
height_unfocused: option("chatHeightUnfocused"),
|
||||
line_spacing: option("chatLineSpacing"),
|
||||
};
|
||||
for m in c["messages"].as_array().into_iter().flatten() {
|
||||
// GuiMessageTag indicator colours: systemSinglePlayer and chatError.
|
||||
let indicator = match m["tag"].as_str() {
|
||||
Some("system") => Some(13684944),
|
||||
Some("error") => Some(16733525),
|
||||
_ => None,
|
||||
};
|
||||
chat.add(
|
||||
atlas,
|
||||
comp(&m["text"]),
|
||||
indicator,
|
||||
m["at"].as_u64().unwrap_or(0),
|
||||
false,
|
||||
);
|
||||
}
|
||||
let focused = c["focused"].as_bool().unwrap_or(false);
|
||||
if let Some(n) = c["scroll"].as_i64() {
|
||||
chat.scroll_by(n as i32, focused);
|
||||
}
|
||||
chat.layout(h, c["now"].as_u64().unwrap_or(0), focused)
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
//! Horizon's LAN world discovery for tools/test_lan_parity.py: the cases of
|
||||
//! VanillaLanOracle (announcements sent, datagrams heard, list resets) run
|
||||
//! through `lan::discovery`, printing the same lines.
|
||||
use horizon_client::lan::discovery::{
|
||||
LanGame, add_server, parse_address, parse_motd, ping_string_text,
|
||||
};
|
||||
|
||||
fn hex(bytes: &[u8]) -> String {
|
||||
bytes.iter().map(|b| format!("{b:02x}")).collect()
|
||||
}
|
||||
fn unhex(s: &str) -> Vec<u8> {
|
||||
(0..s.len() / 2)
|
||||
.map(|i| u8::from_str_radix(&s[2 * i..2 * i + 2], 16).unwrap())
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let cases = std::fs::read_to_string(&args[1]).unwrap();
|
||||
let mut out = String::new();
|
||||
let mut games: Vec<LanGame> = Vec::new();
|
||||
for line in cases.lines() {
|
||||
let f: Vec<&str> = line.split('\t').collect();
|
||||
match f[0] {
|
||||
"ping" => out += &format!("ping {}\n", hex(ping_string_text(f[1], f[2]).as_bytes())),
|
||||
"heard" => {
|
||||
let received = String::from_utf8_lossy(&unhex(f[2])).into_owned();
|
||||
out += &format!(
|
||||
"heard motd={} address={}\n",
|
||||
parse_motd(&received),
|
||||
parse_address(&received).unwrap_or_else(|| "null".into())
|
||||
);
|
||||
if add_server(&mut games, &received, f[1]) {
|
||||
out += "list";
|
||||
for g in &games {
|
||||
out += &format!(" [{} @ {}]", g.motd, g.address);
|
||||
}
|
||||
out += "\n";
|
||||
}
|
||||
}
|
||||
"reset" => games.clear(),
|
||||
other => panic!("{other}"),
|
||||
}
|
||||
}
|
||||
std::fs::write(&args[2], out).unwrap();
|
||||
}
|
||||
@@ -35,10 +35,12 @@ fn main() -> horizon_client::Result<()> {
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let brewing = horizon_client::brewing::Brewing::load(root, &items);
|
||||
let banners = horizon_client::banner::Banners::load(root);
|
||||
let env = Env {
|
||||
items: &items,
|
||||
recipes: &recipes,
|
||||
brewing: &brewing,
|
||||
banners: &banners,
|
||||
};
|
||||
let mut out = String::new();
|
||||
for line in input.lines() {
|
||||
@@ -50,6 +52,7 @@ fn main() -> horizon_client::Result<()> {
|
||||
menu.set_slot(&env, i, parse_stack(slot.as_str().unwrap_or("-"))?);
|
||||
}
|
||||
menu.carried = parse_stack(case["carried"].as_str().unwrap_or("-"))?;
|
||||
menu.settle(&env);
|
||||
for (i, v) in case["data"].as_array().ok_or("data")?.iter().enumerate() {
|
||||
menu.data[i] = v.as_i64().unwrap_or(0) as i32;
|
||||
}
|
||||
@@ -58,6 +61,23 @@ fn main() -> horizon_client::Result<()> {
|
||||
for op in case["ops"].as_array().ok_or("ops")? {
|
||||
let slot = op[0].as_i64().unwrap_or(0) as i32;
|
||||
let button = op[1].as_i64().unwrap_or(0) as i32;
|
||||
match op[2].as_str().unwrap_or_default() {
|
||||
// ServerboundContainerButtonClickPacket: clickMenuButton.
|
||||
"BUTTON" => {
|
||||
menu.button(&env, slot);
|
||||
out += &format!("{}\n", state(&menu));
|
||||
continue;
|
||||
}
|
||||
// ServerboundContainerSlotStateChangedPacket.
|
||||
"SLOT_STATE" => {
|
||||
if (0..9).contains(&slot) {
|
||||
menu.set_slot_state(slot as usize, button == 1);
|
||||
}
|
||||
out += &format!("{}\n", state(&menu));
|
||||
continue;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
let kind = Input::parse(op[2].as_str().unwrap_or_default()).ok_or("input")?;
|
||||
match menu.click(&env, slot, button, kind) {
|
||||
Ok(()) => out += &format!("{}\n", state(&menu)),
|
||||
|
||||
@@ -9,8 +9,13 @@ use horizon_client::{
|
||||
blocks::BlockFacts,
|
||||
chunk::{Chunk, HEIGHT, MIN_Y},
|
||||
collisions,
|
||||
items::Items,
|
||||
containers::{BlockEntity, CreakingHeart},
|
||||
items::{ItemStack, Items},
|
||||
light::{LightTables, light_chunk},
|
||||
mobs::{
|
||||
Damage, MobType, creaking,
|
||||
creaking_heart::{self, HeartEvent, HeartHost},
|
||||
},
|
||||
mobs::{
|
||||
Mob, MobData, MobEvent, MobTypes, MobWorld, PlayerView, Seen, Species, Who,
|
||||
control::Operation, spawning::LocalDifficulty,
|
||||
@@ -43,6 +48,15 @@ struct Scenario {
|
||||
blocks: Vec<Vec<String>>,
|
||||
player: Option<[f64; 3]>,
|
||||
creative: bool,
|
||||
/// The tick from which the player faces another yaw.
|
||||
turn: Option<(i32, f32)>,
|
||||
/// Creaking hearts placed when the scenario starts.
|
||||
hearts: Vec<Vec<String>>,
|
||||
/// `ServerLevel.isSpawningMonsters`.
|
||||
spawning: bool,
|
||||
/// The player hits a mob for 1 at the start of a tick: (tick, mob index).
|
||||
hurts: Vec<(i32, usize)>,
|
||||
hand: Option<String>,
|
||||
mobs: Vec<MobSpec>,
|
||||
}
|
||||
|
||||
@@ -67,19 +81,35 @@ fn parse(text: &str) -> Vec<Scenario> {
|
||||
"rain" => s.rain = true,
|
||||
"thunder" => s.thunder = true,
|
||||
"levelseed" => {}
|
||||
"spawning" => s.spawning = true,
|
||||
_ => panic!("unknown scenario option {kv}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
"origin" => s.origin = [f[1].parse().unwrap(), f[2].parse().unwrap()],
|
||||
"fill" | "block" => s.blocks.push(f.iter().map(|x| (*x).to_owned()).collect()),
|
||||
"fill" | "block" | "chest" => {
|
||||
s.blocks.push(f.iter().map(|x| (*x).to_owned()).collect())
|
||||
}
|
||||
"heart" => s.hearts.push(f.iter().map(|x| (*x).to_owned()).collect()),
|
||||
"hurt" => s.hurts.push((f[1].parse().unwrap(), f[2].parse().unwrap())),
|
||||
"player" => {
|
||||
s.player = Some([
|
||||
f[1].parse().unwrap(),
|
||||
f[2].parse().unwrap(),
|
||||
f[3].parse().unwrap(),
|
||||
]);
|
||||
s.creative = f.get(4) == Some(&"creative");
|
||||
for opt in &f[4..] {
|
||||
if *opt == "creative" {
|
||||
s.creative = true;
|
||||
} else if let Some(t) = opt.strip_prefix("turn=") {
|
||||
let (tick, yaw) = t.split_once(',').unwrap();
|
||||
s.turn = Some((tick.parse().unwrap(), yaw.parse().unwrap()));
|
||||
} else if let Some(item) = opt.strip_prefix("hand=") {
|
||||
s.hand = Some(item.to_owned());
|
||||
} else {
|
||||
panic!("unknown player option {opt}");
|
||||
}
|
||||
}
|
||||
}
|
||||
"mob" => s.mobs.push(MobSpec {
|
||||
kind: f[1].to_owned(),
|
||||
@@ -142,6 +172,8 @@ fn goal_name(m: &Mob, name: &str) -> String {
|
||||
let vanilla = match name {
|
||||
"Float" => "FloatGoal",
|
||||
"Stroll" => "WaterAvoidingRandomStrollGoal",
|
||||
"RandomStroll" => "RandomStrollGoal",
|
||||
"RandomSwimming" => "RandomSwimmingGoal",
|
||||
"LookAtPlayer" => "LookAtPlayerGoal",
|
||||
"RandomLookAround" => "RandomLookAroundGoal",
|
||||
"HurtByTarget" => "HurtByTargetGoal",
|
||||
@@ -171,6 +203,12 @@ fn goal_name(m: &Mob, name: &str) -> String {
|
||||
"TryFindWater" => "TryFindWaterGoal",
|
||||
"RangedAttack" => "RangedAttackGoal",
|
||||
"MoveTowardsTarget" => "MoveTowardsTargetGoal",
|
||||
"DrownedGoToWater" => "DrownedGoToWaterGoal",
|
||||
"TakeBlock" => "EndermanTakeBlockGoal",
|
||||
"LeaveBlock" => "EndermanLeaveBlockGoal",
|
||||
"FreezeWhenLookedAt" => "EndermanFreezeWhenLookedAt",
|
||||
"LookForPlayer" => "EndermanLookForPlayerGoal",
|
||||
"HealRaiders" => "NearestHealableRaiderTargetGoal",
|
||||
other => return other.to_owned(),
|
||||
};
|
||||
vanilla.to_owned()
|
||||
@@ -187,47 +225,253 @@ fn goals(m: &Mob, names: Vec<&'static str>) -> String {
|
||||
.join("|")
|
||||
}
|
||||
|
||||
fn seen(m: &Mob) -> Seen {
|
||||
Seen {
|
||||
id: m.id,
|
||||
species: m.species(),
|
||||
position: m.position,
|
||||
bounds: m.bounds(),
|
||||
eye_y: m.eye_y(),
|
||||
alive: m.alive(),
|
||||
baby: m.is_baby(),
|
||||
in_love: if m.species() == Species::Villager {
|
||||
horizon_client::mobs::villager::can_breed(m)
|
||||
} else {
|
||||
m.extra.in_love > 0
|
||||
},
|
||||
tame: m.extra.tame,
|
||||
hostile: m.hostile(),
|
||||
target: m.ai.target,
|
||||
health: m.health,
|
||||
variant: m.extra.variant,
|
||||
color: m.extra.color,
|
||||
job: (m.species() == Species::Villager)
|
||||
.then_some(m.extra.home)
|
||||
.flatten(),
|
||||
bed: (m.species() == Species::Villager)
|
||||
.then_some(m.extra.bed)
|
||||
.flatten(),
|
||||
yaw: m.yaw,
|
||||
velocity: m.velocity,
|
||||
leash: m.extra.leash,
|
||||
caravan: horizon_client::mobs::caravan::head_of(m),
|
||||
delay: m.extra.ints[5],
|
||||
hurt_by: m.ai.last_hurt_by.map(|w| (w, m.ai.last_hurt_by_time)),
|
||||
active_raid: horizon_client::mobs::raider::has_active_raid(m),
|
||||
player_rep: 0,
|
||||
/// The oracle's villager flags: profession, level, xp, food, inventory,
|
||||
/// gossip about the player and the last sleep.
|
||||
fn villager_flag(m: &mut Mob, flag: &str) {
|
||||
use horizon_client::mobs::villager;
|
||||
let (k, v) = flag
|
||||
.split_once('=')
|
||||
.unwrap_or_else(|| panic!("unknown mob flag {flag}"));
|
||||
match k {
|
||||
"profession" => {
|
||||
let p = horizon_client::mobs::render::PROFESSIONS
|
||||
.iter()
|
||||
.position(|p| *p == v)
|
||||
.expect("profession");
|
||||
villager::set_profession(m, p as u8);
|
||||
}
|
||||
"level" => m.extra.variant3 = v.parse().unwrap(),
|
||||
"xp" => {
|
||||
m.extra.trade.get_or_insert_with(Default::default).xp = v.parse().unwrap();
|
||||
}
|
||||
"food" => villager::ext_mut(m).food_level = v.parse().unwrap(),
|
||||
"inv" => {
|
||||
for item in v.split(',') {
|
||||
let (name, count) = item.split_once('*').unwrap_or((item, "1"));
|
||||
villager::ext_mut(m)
|
||||
.inventory
|
||||
.push(horizon_client::items::ItemStack::new(
|
||||
&if name.contains(':') {
|
||||
name.to_owned()
|
||||
} else {
|
||||
format!("minecraft:{name}")
|
||||
},
|
||||
count.parse().unwrap(),
|
||||
));
|
||||
}
|
||||
}
|
||||
"gossip" => {
|
||||
let g: Vec<&str> = v.split(':').collect();
|
||||
assert_eq!(g[0], "player", "gossip about the player only");
|
||||
let kind = horizon_client::gossip::GossipType::from_id(g[1]).expect("gossip type");
|
||||
villager::ext_mut(m)
|
||||
.gossips
|
||||
.add(PLAYER_UUID, kind, g[2].parse().unwrap());
|
||||
}
|
||||
"slept" => villager::ext_mut(m).last_slept = Some(v.parse().unwrap()),
|
||||
_ => panic!("unknown mob flag {flag}"),
|
||||
}
|
||||
}
|
||||
|
||||
fn print(out: &mut String, t: i32, i: usize, m: &Mob) {
|
||||
/// The random seed of the entity a scenario spawns at this index (the
|
||||
/// oracle's `spawnSeed`).
|
||||
fn spawn_seed(index: usize) -> i64 {
|
||||
1000 + 7919 * index as i64
|
||||
}
|
||||
|
||||
/// Villager events that act at once in vanilla (`TradeWithVillager` and
|
||||
/// `VillagerMakeLove` write the other villager directly).
|
||||
fn villager_events(
|
||||
mobs: &mut [Mob],
|
||||
events: &mut Vec<MobEvent>,
|
||||
from: usize,
|
||||
w: &MobWorld,
|
||||
types: &MobTypes,
|
||||
items: &Items,
|
||||
born: &mut Vec<Mob>,
|
||||
day_time: i64,
|
||||
) {
|
||||
use horizon_client::mobs::villager;
|
||||
let index = |mobs: &[Mob], id: u32| {
|
||||
mobs.iter()
|
||||
.position(|m| m.id == id && m.species() == Species::Villager)
|
||||
};
|
||||
let mut i = from;
|
||||
while i < events.len() {
|
||||
match events[i] {
|
||||
MobEvent::VillagerMeet { mob, other } => {
|
||||
if let (Some(a), Some(b)) = (index(mobs, mob), index(mobs, other)) {
|
||||
let meeting = villager::meet(mobs, a, b, w.game_time, |item| {
|
||||
items.get(item).map_or(64, |i| i.max_stack)
|
||||
});
|
||||
assert!(
|
||||
meeting.thrown.is_empty(),
|
||||
"villagers toss items: not modelled here"
|
||||
);
|
||||
}
|
||||
events.remove(i);
|
||||
}
|
||||
MobEvent::VillagerBirth {
|
||||
parent,
|
||||
partner,
|
||||
child,
|
||||
} => {
|
||||
events.remove(i);
|
||||
let (Some(a), Some(b)) = (index(mobs, parent), index(mobs, partner)) else {
|
||||
continue;
|
||||
};
|
||||
villager::ext_mut(&mut mobs[b]).eat_and_digest();
|
||||
let Some((bed, variant)) = child else {
|
||||
continue;
|
||||
};
|
||||
mobs[b].extra.age = 6000;
|
||||
let index = mobs.len() + born.len();
|
||||
let kind = types.types.get("minecraft:villager").expect("villager");
|
||||
let p = mobs[a].position;
|
||||
let mut child = Mob::new(100_000 + index as u32, Arc::new(kind.clone()), p, 0.0);
|
||||
child.persistent = true;
|
||||
// The flat world is all plains (type 0).
|
||||
child.extra.variant = variant.unwrap_or(0);
|
||||
child.extra.variant2 = villager::NONE;
|
||||
child.extra.age = -24000;
|
||||
child.extra.bed = Some(bed);
|
||||
let seed = spawn_seed(index);
|
||||
child.random = LegacyRandom::new(seed);
|
||||
horizon_client::mobs::villager_brain::init(&mut child, w.game_time, day_time, seed);
|
||||
born.push(child);
|
||||
}
|
||||
_ => i += 1,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The player's UUID (the oracle's `PLAYER_UUID`).
|
||||
const PLAYER_UUID: [i32; 4] = [0, 0x1234, 0, 0x5678];
|
||||
|
||||
fn seen(m: &Mob) -> Seen {
|
||||
m.seen(Some(PLAYER_UUID))
|
||||
}
|
||||
|
||||
/// The probe's mobs as a creaking heart sees them: creakings it creates take
|
||||
/// the n-th seed from 1000, as the oracle's do.
|
||||
struct Host<'a> {
|
||||
mobs: &'a mut Vec<Mob>,
|
||||
added: Vec<Mob>,
|
||||
types: &'a MobTypes,
|
||||
created: &'a mut i64,
|
||||
spawning: bool,
|
||||
}
|
||||
impl HeartHost for Host<'_> {
|
||||
fn mob(&self, id: u32) -> Option<&Mob> {
|
||||
self.mobs
|
||||
.iter()
|
||||
.chain(self.added.iter())
|
||||
.find(|m| m.id == id)
|
||||
}
|
||||
fn mob_mut(&mut self, id: u32) -> Option<&mut Mob> {
|
||||
self.mobs
|
||||
.iter_mut()
|
||||
.chain(self.added.iter_mut())
|
||||
.find(|m| m.id == id)
|
||||
}
|
||||
fn mob_for_uuid(&self, uuid: [i32; 4]) -> Option<u32> {
|
||||
self.mob(uuid[3] as u32)
|
||||
.filter(|m| !m.removed)
|
||||
.map(|m| m.id)
|
||||
}
|
||||
fn uuid_for(&mut self, id: u32) -> [i32; 4] {
|
||||
[0, 0, 0, id as i32]
|
||||
}
|
||||
fn creaking_type(&self) -> Option<Arc<MobType>> {
|
||||
self.types
|
||||
.types
|
||||
.get("minecraft:creaking")
|
||||
.map(|t| Arc::new(t.clone()))
|
||||
}
|
||||
fn create_mob(&mut self, kind: Arc<MobType>, at: Vec3) -> Mob {
|
||||
let seed = 1000 + *self.created;
|
||||
*self.created += 1;
|
||||
let mut m = Mob::new(200_000 + seed as u32, kind, at, 0.0);
|
||||
m.random = LegacyRandom::new(seed);
|
||||
horizon_client::mobs::monster_brain::init(&mut m, seed);
|
||||
m
|
||||
}
|
||||
fn add_mob(&mut self, m: Mob) {
|
||||
self.added.push(m);
|
||||
}
|
||||
fn spawning_monsters(&self) -> bool {
|
||||
self.spawning
|
||||
}
|
||||
}
|
||||
/// The heart's state, block entity and the level random, as the oracle
|
||||
/// prints them.
|
||||
fn print_heart(
|
||||
out: &mut String,
|
||||
t: i32,
|
||||
registry: &BlockRegistry,
|
||||
world: &World,
|
||||
at: [i32; 3],
|
||||
heart: &CreakingHeart,
|
||||
lr: &LegacyRandom,
|
||||
) {
|
||||
let state = registry
|
||||
.state(world.block(at[0], at[1], at[2]))
|
||||
.and_then(|s| s.properties.get("creaking_heart_state").cloned())
|
||||
.unwrap_or_default();
|
||||
let _ = writeln!(
|
||||
out,
|
||||
"{t} heart {},{},{}\t{state}\t{} {} {} {} {}\tlrng {:x}",
|
||||
at[0],
|
||||
at[1],
|
||||
at[2],
|
||||
heart.ticker,
|
||||
heart.emitter,
|
||||
heart.output_signal,
|
||||
heart.ticks_existed,
|
||||
if heart.creaking.is_some() {
|
||||
"linked"
|
||||
} else {
|
||||
"none"
|
||||
},
|
||||
lr.state()
|
||||
);
|
||||
}
|
||||
|
||||
/// The damage of a mob's direct hit on the player (others count as none).
|
||||
fn player_damage(e: &MobEvent) -> f32 {
|
||||
match e {
|
||||
MobEvent::AttackPlayer(amount, _) | MobEvent::DamagePlayer { amount, .. } => *amount,
|
||||
_ => 0.0,
|
||||
}
|
||||
}
|
||||
/// Whether an event hurts the scenario's player (survival, normal difficulty,
|
||||
/// no armour, made hurtable again every tick by the oracle).
|
||||
fn player_hurt(player: Option<&PlayerView>, e: &MobEvent) -> bool {
|
||||
let Some(p) = player.filter(|p| !p.creative) else {
|
||||
return false;
|
||||
};
|
||||
match e {
|
||||
MobEvent::AttackPlayer(amount, _) | MobEvent::DamagePlayer { amount, .. } => *amount > 0.0,
|
||||
// ServerExplosion.hurtEntities: within twice the radius every hit does damage.
|
||||
MobEvent::Explode(at, radius) => {
|
||||
let d = Vec3::new(at[0], at[1], at[2])
|
||||
.distance_squared(p.position)
|
||||
.sqrt();
|
||||
let r = 2.0 * f64::from(*radius);
|
||||
d / r <= 1.0 && d != 0.0
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// `player_down`: the scenario's player is no valid target (creative, or
|
||||
/// killed this tick).
|
||||
fn print(out: &mut String, t: i32, i: usize, m: &Mob, player_down: bool) {
|
||||
let _ = write!(out, "{t} {i}");
|
||||
if m.removed {
|
||||
let _ = writeln!(out, " removed DISCARDED");
|
||||
// Entity.RemovalReason: the end of the death animation, else a discard.
|
||||
let reason = if m.alive() { "DISCARDED" } else { "KILLED" };
|
||||
let _ = writeln!(out, " removed {reason}");
|
||||
return;
|
||||
}
|
||||
let p = m.position;
|
||||
@@ -262,7 +506,13 @@ fn print(out: &mut String, t: i32, i: usize, m: &Mob) {
|
||||
"\tgoals {}\ttargets {}\ttarget {}",
|
||||
goals(m, m.ai.goals.running_names()),
|
||||
goals(m, m.ai.targets.running_names()),
|
||||
who(m.ai.target)
|
||||
// Warden.getTarget: the brain's attack target, if still valid.
|
||||
who(match horizon_client::mobs::warden::brain_target(m) {
|
||||
Some(Who::Player) if player_down => None,
|
||||
Some(target) => Some(target),
|
||||
None if m.species() == Species::Warden => None,
|
||||
None => m.ai.target,
|
||||
})
|
||||
);
|
||||
let _ = write!(out, "\tnav ");
|
||||
match &m.ai.nav.path {
|
||||
@@ -316,7 +566,109 @@ fn print(out: &mut String, t: i32, i: usize, m: &Mob) {
|
||||
f(m.ai.speed),
|
||||
u8::from(m.ai.jumping)
|
||||
);
|
||||
let _ = writeln!(out, "\trng {:x}", m.random.state());
|
||||
let _ = write!(out, "\trng {:x}", m.random.state());
|
||||
let brain = horizon_client::mobs::villager_brain::describe(m)
|
||||
.or_else(|| horizon_client::mobs::warden_brain::describe(m))
|
||||
.or_else(|| horizon_client::mobs::monster_brain::describe(m))
|
||||
.or_else(|| horizon_client::mobs::animal_brain::describe(m));
|
||||
if let Some((acts, mem)) = brain {
|
||||
let _ = write!(out, "\tact {acts}\tmem {mem}");
|
||||
}
|
||||
if m.species() == Species::Villager {
|
||||
let _ = write!(out, "\tvx {}", villager(m));
|
||||
}
|
||||
if m.species() == Species::CopperGolem {
|
||||
let held = horizon_client::mobs::transport_items::held(m).map_or("-".into(), stack);
|
||||
let opened = m
|
||||
.extra
|
||||
.opened_chest
|
||||
.map_or("-".into(), |p| format!("{},{},{}", p[0], p[1], p[2]));
|
||||
let _ = write!(out, "\tcg {} {held} {opened}", m.extra.variant3);
|
||||
}
|
||||
out.push('\n');
|
||||
}
|
||||
|
||||
fn stack(s: &horizon_client::items::ItemStack) -> String {
|
||||
if s.count == 0 {
|
||||
return "-".into();
|
||||
}
|
||||
format!("{}*{}", s.item.trim_start_matches("minecraft:"), s.count)
|
||||
}
|
||||
|
||||
/// The oracle's `villager`: data, food, inventory, gossip, sleep and offers.
|
||||
fn villager(m: &Mob) -> String {
|
||||
use horizon_client::mobs::villager;
|
||||
let e = villager::ext(m);
|
||||
let mut slots: Vec<String> = (0..8)
|
||||
.map(|k| {
|
||||
e.and_then(|e| e.inventory.get(k))
|
||||
.map_or_else(|| "-".to_owned(), stack)
|
||||
})
|
||||
.collect();
|
||||
while slots.last().is_some_and(|s| s == "-") {
|
||||
slots.pop();
|
||||
}
|
||||
// Villagers gossip about players only.
|
||||
let label = |t: [i32; 4]| {
|
||||
if t == PLAYER_UUID {
|
||||
"player".to_owned()
|
||||
} else {
|
||||
format!("{t:?}")
|
||||
}
|
||||
};
|
||||
let mut gossips: Vec<String> = e
|
||||
.map(|e| {
|
||||
e.gossips
|
||||
.entries()
|
||||
.map(|(t, k, v)| format!("{}:{}={v}", label(t), k.id()))
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
gossips.sort();
|
||||
let join = |v: &[String]| {
|
||||
if v.is_empty() {
|
||||
"-".to_owned()
|
||||
} else {
|
||||
v.join(",")
|
||||
}
|
||||
};
|
||||
let mut s = format!(
|
||||
"prof {} lvl {} xp {} food {} age {} inv {} gossip {} rep {} sleep {}",
|
||||
horizon_client::mobs::render::PROFESSIONS[m.extra.variant2 as usize % 15],
|
||||
m.extra.variant3.max(1),
|
||||
villager::xp(m),
|
||||
e.map_or(0, |e| e.food_level),
|
||||
m.extra.age,
|
||||
join(&slots),
|
||||
join(&gossips),
|
||||
e.map_or(0, |e| e.gossips.reputation(PLAYER_UUID)),
|
||||
match (villager::sleeping(m), m.extra.bed) {
|
||||
(true, Some(b)) => format!("{},{},{}", b[0], b[1], b[2]),
|
||||
_ => "-".into(),
|
||||
}
|
||||
);
|
||||
if let Some(t) = m.extra.trade.as_ref().filter(|t| !t.offers.is_empty()) {
|
||||
let offers: Vec<String> = t
|
||||
.offers
|
||||
.iter()
|
||||
.map(|o| {
|
||||
format!(
|
||||
"{}+{}>{}/{}/{}/{}/{}",
|
||||
stack(&o.base_cost_a.stack),
|
||||
o.cost_b
|
||||
.as_ref()
|
||||
.map_or_else(|| "-".to_owned(), |c| stack(&c.stack)),
|
||||
stack(&o.result),
|
||||
o.uses,
|
||||
o.max_uses,
|
||||
o.demand,
|
||||
o.special_price_diff
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
s.push_str(&format!(" offers {}", join(&offers)));
|
||||
}
|
||||
s
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
@@ -370,8 +722,23 @@ fn main() -> horizon_client::Result<()> {
|
||||
}
|
||||
for b in &s.blocks {
|
||||
let n = |i: usize| b[i].parse::<i32>().unwrap();
|
||||
if b[0] == "block" {
|
||||
if b[0] == "block" || b[0] == "chest" {
|
||||
world.set(n(1), n(2), n(3), state(registry, &b[4]))?;
|
||||
if b[0] == "chest" {
|
||||
// chest X Y Z STATE SLOTS: item*count or - per slot.
|
||||
let mut slots = vec![None; 27];
|
||||
for (k, item) in b.get(5).map_or("", String::as_str).split(',').enumerate() {
|
||||
if let Some((id, count)) = item.split_once('*') {
|
||||
slots[k] = Some(ItemStack::new(
|
||||
&format!("minecraft:{id}"),
|
||||
count.parse().unwrap(),
|
||||
));
|
||||
}
|
||||
}
|
||||
world
|
||||
.block_entities
|
||||
.insert((n(1), n(2), n(3)), BlockEntity::Chest(slots));
|
||||
}
|
||||
} else {
|
||||
let st = state(registry, &b[7]);
|
||||
for x in n(1).min(n(4))..=n(1).max(n(4)) {
|
||||
@@ -383,6 +750,17 @@ fn main() -> horizon_client::Result<()> {
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut hearts: Vec<([i32; 3], CreakingHeart)> = Vec::new();
|
||||
for h in &s.hearts {
|
||||
let at = [
|
||||
h[1].parse::<i32>().unwrap(),
|
||||
h[2].parse::<i32>().unwrap(),
|
||||
h[3].parse::<i32>().unwrap(),
|
||||
];
|
||||
world.set(at[0], at[1], at[2], state(registry, &h[4]))?;
|
||||
hearts.push((at, CreakingHeart::default()));
|
||||
}
|
||||
let mut created = 0_i64;
|
||||
let keys: Vec<(i32, i32)> = world.chunks.keys().copied().collect();
|
||||
let lit: Vec<((i32, i32), Chunk)> = keys
|
||||
.iter()
|
||||
@@ -425,13 +803,68 @@ fn main() -> horizon_client::Result<()> {
|
||||
match flag.as_str() {
|
||||
"persistent" => m.persistent = true,
|
||||
"noai" => m.no_ai = true,
|
||||
other => panic!("unknown mob flag {other}"),
|
||||
// Warden.finalizeSpawn's own part.
|
||||
"digcooldown" | "emerge" => horizon_client::mobs::warden::finalize(
|
||||
&mut m,
|
||||
flag == "emerge",
|
||||
&mut Vec::new(),
|
||||
),
|
||||
"inlove" => m.extra.in_love = 600,
|
||||
"tame" => m.extra.tame = true,
|
||||
x if x.starts_with("age=") => m.extra.age = x[4..].parse().unwrap(),
|
||||
x if x.starts_with("strength=") => m.extra.variant2 = x[9..].parse().unwrap(),
|
||||
x if x.starts_with("hand=") => {
|
||||
let (id, count) = x[5..].split_once('*').unwrap();
|
||||
let stack =
|
||||
ItemStack::new(&format!("minecraft:{id}"), count.parse().unwrap());
|
||||
horizon_client::mobs::transport_items::set_held(&mut m, Some(stack));
|
||||
}
|
||||
// Set once the brain exists (below).
|
||||
x if x.starts_with("cooldown=") => {}
|
||||
"leashed" => m.extra.leash = Some(horizon_client::mobs::leash::Holder::Player),
|
||||
x if x.starts_with("leashto=") => {
|
||||
let n: u32 = x[8..].parse().unwrap();
|
||||
m.extra.leash = Some(horizon_client::mobs::leash::Holder::Mob(100_000 + n));
|
||||
}
|
||||
other => villager_flag(&mut m, other),
|
||||
}
|
||||
}
|
||||
m.random = LegacyRandom::new(spec.seed);
|
||||
if horizon_client::mobs::monster_brain::has_brain(m.species()) {
|
||||
// The oracle delays the sensors again with the seeded random
|
||||
// and seeds RunOne's shuffles with the mob's seed.
|
||||
horizon_client::mobs::monster_brain::init(&mut m, spec.seed);
|
||||
}
|
||||
if m.species() == Species::Villager {
|
||||
// The oracle seeds the random after the brain is built, then
|
||||
// delays the sensors again and seeds the gates' shuffles.
|
||||
horizon_client::mobs::villager_brain::init(
|
||||
&mut m,
|
||||
world.game_time,
|
||||
s.time,
|
||||
spec.seed,
|
||||
);
|
||||
}
|
||||
if m.species() == Species::Warden {
|
||||
// As for villagers: the sensors delayed again, the RunOne seeded.
|
||||
horizon_client::mobs::warden::init_brain(&mut m, spec.seed);
|
||||
}
|
||||
// The same for the sniffer's and the happy ghast's brains.
|
||||
if horizon_client::mobs::animal_brain::kind_of(&m).is_some() {
|
||||
horizon_client::mobs::animal_brain::init(&mut m, spec.seed);
|
||||
}
|
||||
if let Some(c) = spec.flags.iter().find_map(|f| f.strip_prefix("cooldown=")) {
|
||||
horizon_client::mobs::animal_brain::set_transport_cooldown(
|
||||
&mut m,
|
||||
c.parse().unwrap(),
|
||||
);
|
||||
}
|
||||
mobs.push(m);
|
||||
}
|
||||
let player = s.player.map(|p| {
|
||||
// Without a player of its own a scenario still has the oracle's,
|
||||
// 5000 blocks east (Mob.checkDespawn draws for it).
|
||||
let far = [f64::from(s.origin[0] + 5000), -60.0, f64::from(s.origin[1])];
|
||||
let mut player = Some(s.player.unwrap_or(far)).map(|p| {
|
||||
let position = Vec3::new(p[0], p[1], p[2]);
|
||||
PlayerView {
|
||||
position,
|
||||
@@ -444,7 +877,7 @@ fn main() -> horizon_client::Result<()> {
|
||||
creative: s.creative,
|
||||
sneaking: false,
|
||||
look: [0.0, 0.0, 1.0],
|
||||
main_hand: None,
|
||||
main_hand: s.hand.as_deref().map(Into::into),
|
||||
off_hand: None,
|
||||
head: None,
|
||||
armor_cover: 0.0,
|
||||
@@ -455,48 +888,252 @@ fn main() -> horizon_client::Result<()> {
|
||||
velocity: Vec3::ZERO,
|
||||
yaw: 0.0,
|
||||
hero: false,
|
||||
uuid: [0, 0x1234, 0, 0x5678],
|
||||
uuid: PLAYER_UUID,
|
||||
allies: Default::default(),
|
||||
}
|
||||
});
|
||||
let mut scratch = LegacyRandom::new(0);
|
||||
for (i, m) in mobs.iter().enumerate() {
|
||||
print(&mut out, 0, i, m);
|
||||
print(&mut out, 0, i, m, s.creative);
|
||||
}
|
||||
// The MobWorld every step sees, over a snapshot of the mobs.
|
||||
macro_rules! mob_world {
|
||||
($snapshot:expr) => {
|
||||
MobWorld {
|
||||
teams: Default::default(),
|
||||
world: &world,
|
||||
registry,
|
||||
facts: &facts,
|
||||
collision: &collision,
|
||||
data: &data,
|
||||
player: player.clone(),
|
||||
others: $snapshot,
|
||||
daylight: (s.time.rem_euclid(24000)) < 12000,
|
||||
game_time: world.game_time,
|
||||
day_time: world.day_time,
|
||||
raining: s.rain,
|
||||
thundering: s.thunder,
|
||||
nether: false,
|
||||
block_tags: &items.block_tags,
|
||||
biomes: &biomes,
|
||||
mob_griefing: true,
|
||||
difficulty: LocalDifficulty::new(2, world.day_time, 0, 0.0),
|
||||
end: false,
|
||||
world_seed: 0,
|
||||
// FlatLevelSource.getSeaLevel.
|
||||
sea_level: -63,
|
||||
items: Some(&items),
|
||||
}
|
||||
};
|
||||
}
|
||||
for t in 1..=s.ticks {
|
||||
world.game_time += 1;
|
||||
let snapshot: Vec<Seen> = mobs.iter().filter(|m| !m.removed).map(seen).collect();
|
||||
let w = MobWorld {
|
||||
world: &world,
|
||||
registry,
|
||||
facts: &facts,
|
||||
collision: &collision,
|
||||
data: &data,
|
||||
player: player.clone(),
|
||||
others: &snapshot,
|
||||
daylight: (s.time.rem_euclid(24000)) < 12000,
|
||||
game_time: world.game_time,
|
||||
day_time: world.day_time,
|
||||
raining: s.rain,
|
||||
thundering: s.thunder,
|
||||
nether: false,
|
||||
block_tags: &items.block_tags,
|
||||
biomes: &biomes,
|
||||
mob_griefing: true,
|
||||
difficulty: LocalDifficulty::new(2, world.day_time, 0, 0.0),
|
||||
end: false,
|
||||
world_seed: 0,
|
||||
};
|
||||
let mut heart_events_later: Vec<HeartEvent> = Vec::new();
|
||||
// Creaking.tick reads the heart's block entity.
|
||||
for (at, h) in &hearts {
|
||||
world.block_entities.insert(
|
||||
(at[0], at[1], at[2]),
|
||||
BlockEntity::CreakingHeart(Box::new(h.clone())),
|
||||
);
|
||||
}
|
||||
if let (Some(p), Some((tick, yaw))) = (player.as_mut(), s.turn)
|
||||
&& t >= tick
|
||||
{
|
||||
// Entity.calculateViewVector(0, yaw).
|
||||
let r = -yaw * horizon_core::geometry::trig::DEG_TO_RAD;
|
||||
let (cos, sin) = (
|
||||
horizon_core::geometry::trig::cos(f64::from(r)),
|
||||
horizon_core::geometry::trig::sin(f64::from(r)),
|
||||
);
|
||||
p.look = [f64::from(sin), -0.0, f64::from(cos)];
|
||||
p.yaw = yaw;
|
||||
}
|
||||
let mut snapshot: Vec<Seen> = mobs.iter().filter(|m| !m.removed).map(seen).collect();
|
||||
let w = mob_world!(&snapshot);
|
||||
let mut events = Vec::new();
|
||||
for m in &mut mobs {
|
||||
if m.removed {
|
||||
let mut heart_events = Vec::new();
|
||||
let mut added = Vec::new();
|
||||
for &(tick, i) in &s.hurts {
|
||||
if tick != t || i >= mobs.len() || mobs[i].removed {
|
||||
continue;
|
||||
}
|
||||
if !m.tick(&w, &mut scratch, &mut events) {
|
||||
let at = player
|
||||
.as_ref()
|
||||
.map_or([0.0; 3], |p| [p.position.x, p.position.y, p.position.z]);
|
||||
mobs[i].damage(1.0, Damage::player(at));
|
||||
// Creaking.hurtServer: the heart's reaction, then the sway.
|
||||
if let Some((home, by_player)) = creaking::take_hurt(&mut mobs[i], &w) {
|
||||
if by_player && let Some((_, h)) = hearts.iter_mut().find(|(at, _)| *at == home)
|
||||
{
|
||||
let mut host = Host {
|
||||
mobs: &mut mobs,
|
||||
added: Vec::new(),
|
||||
types: &types,
|
||||
created: &mut created,
|
||||
spawning: s.spawning,
|
||||
};
|
||||
creaking_heart::creaking_hurt(
|
||||
h,
|
||||
home,
|
||||
&w,
|
||||
&mut scratch,
|
||||
&mut host,
|
||||
&mut heart_events,
|
||||
);
|
||||
added.append(&mut host.added);
|
||||
}
|
||||
for e in heart_events.drain(..) {
|
||||
match e {
|
||||
HeartEvent::Sound(name, _, volume, pitch) => {
|
||||
events.push(MobEvent::Sound(name, [0.0; 3], volume, pitch))
|
||||
}
|
||||
HeartEvent::SetBlock(..) => heart_events_later.push(e),
|
||||
HeartEvent::Mob(ev) => events.push(ev),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
creaking::sway(&mut mobs[i], &mut events);
|
||||
}
|
||||
events.append(&mut mobs[i].outbox);
|
||||
}
|
||||
#[allow(unused_mut)] // filled only with the rng-trace feature
|
||||
let mut traces: Vec<String> = Vec::new();
|
||||
let mut pushes = Vec::new();
|
||||
let mut born = Vec::new();
|
||||
for i in 0..mobs.len() {
|
||||
if mobs[i].removed {
|
||||
continue;
|
||||
}
|
||||
let w = mob_world!(&snapshot);
|
||||
let m = &mut mobs[i];
|
||||
horizon_client::mobs::apply_mob_pushes(m, &mut pushes);
|
||||
let from = events.len();
|
||||
#[cfg(feature = "rng-trace")]
|
||||
horizon_core::random::trace::set(true);
|
||||
let alive = m.tick(&w, &mut scratch, &mut events);
|
||||
#[cfg(feature = "rng-trace")]
|
||||
{
|
||||
horizon_core::random::trace::set(false);
|
||||
for line in horizon_core::random::trace::take() {
|
||||
traces.push(format!("{t} trace {i} {line}"));
|
||||
}
|
||||
}
|
||||
horizon_client::mobs::take_mob_pushes(&mut events, from, &mut pushes);
|
||||
if !alive {
|
||||
m.removed = true;
|
||||
}
|
||||
horizon_client::mobs::apply_brain_events(&mut mobs, &mut events, from);
|
||||
villager_events(
|
||||
&mut mobs,
|
||||
&mut events,
|
||||
from,
|
||||
&w,
|
||||
&types,
|
||||
&items,
|
||||
&mut born,
|
||||
s.time,
|
||||
);
|
||||
horizon_client::mobs::warden::hear_mob_events(&mut mobs, &events, from, &w);
|
||||
// Melee hits on other mobs land during the attacker's tick
|
||||
// (LivingEntity.hurtServer), with the sounds they raise.
|
||||
let mut k = from;
|
||||
while k < events.len() {
|
||||
if let MobEvent::AttackMob {
|
||||
target,
|
||||
amount,
|
||||
source,
|
||||
} = events[k]
|
||||
&& let Some(t) = mobs.iter_mut().find(|m| m.id == target)
|
||||
&& t.damage(amount, source)
|
||||
{
|
||||
let raised = std::mem::take(&mut t.outbox);
|
||||
let n = raised.len();
|
||||
events.splice(k + 1..k + 1, raised);
|
||||
k += n;
|
||||
}
|
||||
k += 1;
|
||||
}
|
||||
// What a copper golem did to chests, before the next mob ticks.
|
||||
for e in &events[from.min(events.len())..] {
|
||||
match e {
|
||||
MobEvent::ChestOpen { chest, open } => {
|
||||
let o = world
|
||||
.chest_openers
|
||||
.entry((chest[0], chest[1], chest[2]))
|
||||
.or_insert((0, 0.0));
|
||||
if *open {
|
||||
o.0 += 1;
|
||||
o.1 = o.1.max(3.0);
|
||||
} else {
|
||||
o.0 -= 1;
|
||||
if o.0 == 0 {
|
||||
o.1 = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
MobEvent::ChestSlot { chest, slot, stack } => {
|
||||
if let Some(e) = world
|
||||
.block_entities
|
||||
.get_mut(&(chest[0], chest[1], chest[2]))
|
||||
&& let Some(sl) = e.slots_mut().get_mut(*slot)
|
||||
{
|
||||
*sl = stack.clone();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
// ServerLevel ticks entities one after another: the ones
|
||||
// after this mob see it as it is now.
|
||||
if let Some(e) = snapshot.iter_mut().find(|e| e.id == mobs[i].id) {
|
||||
*e = seen(&mobs[i]);
|
||||
e.alive &= !mobs[i].removed;
|
||||
}
|
||||
}
|
||||
for m in &mut mobs {
|
||||
horizon_client::mobs::apply_mob_pushes(m, &mut pushes);
|
||||
}
|
||||
let w = mob_world!(&snapshot);
|
||||
// ServerLevel.tickBlockEntities: the hearts (none ticks once uprooted).
|
||||
heart_events.append(&mut heart_events_later);
|
||||
for (at, h) in &mut hearts {
|
||||
let uprooted = registry
|
||||
.state(w.world.block(at[0], at[1], at[2]))
|
||||
.and_then(|s| s.properties.get("creaking_heart_state").cloned())
|
||||
.is_some_and(|v| v == "uprooted");
|
||||
if uprooted {
|
||||
continue;
|
||||
}
|
||||
let mut host = Host {
|
||||
mobs: &mut mobs,
|
||||
added: Vec::new(),
|
||||
types: &types,
|
||||
created: &mut created,
|
||||
spawning: s.spawning,
|
||||
};
|
||||
creaking_heart::server_tick(h, *at, &w, &mut scratch, &mut host, &mut heart_events);
|
||||
added.append(&mut host.added);
|
||||
}
|
||||
drop(w);
|
||||
mobs.append(&mut born);
|
||||
mobs.append(&mut added);
|
||||
for e in &heart_events {
|
||||
match e {
|
||||
HeartEvent::SetBlock(at, st) => world.set(at[0], at[1], at[2], *st)?,
|
||||
HeartEvent::Sound(name, _, volume, pitch) => {
|
||||
events.push(MobEvent::Sound(name, [0.0; 3], *volume, *pitch))
|
||||
}
|
||||
HeartEvent::Mob(ev) => events.push(ev.clone()),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
// A hit for the player's whole health kills it until the oracle
|
||||
// heals it next tick.
|
||||
let player_killed = events
|
||||
.iter()
|
||||
.any(|e| player_hurt(player.as_ref(), e) && player_damage(e) >= 20.0);
|
||||
for (i, m) in mobs.iter().enumerate() {
|
||||
print(&mut out, t, i, m);
|
||||
print(&mut out, t, i, m, s.creative || player_killed);
|
||||
}
|
||||
for e in &events {
|
||||
if let MobEvent::Sound(name, _, volume, pitch) = e {
|
||||
@@ -508,8 +1145,54 @@ fn main() -> horizon_client::Result<()> {
|
||||
);
|
||||
} else if let MobEvent::SoundId(name, _, volume, pitch) = e {
|
||||
let _ = writeln!(out, "{t} sound {name} {} {}", f(*volume), f(*pitch));
|
||||
} else if player_hurt(player.as_ref(), e) {
|
||||
// The oracle's survival player, healed and made hurtable every tick,
|
||||
// takes the damage (LivingEntity.playHurtSound).
|
||||
let sound = if player_damage(e) >= 20.0 {
|
||||
"death"
|
||||
} else {
|
||||
"hurt"
|
||||
};
|
||||
let _ = writeln!(
|
||||
out,
|
||||
"{t} sound minecraft:entity.player.{sound} 3f800000 3f800000"
|
||||
);
|
||||
}
|
||||
}
|
||||
for (at, h) in &hearts {
|
||||
print_heart(&mut out, t, registry, &world, *at, h, &scratch);
|
||||
}
|
||||
for b in s.blocks.iter().filter(|b| b[0] == "chest") {
|
||||
let n = |i: usize| b[i].parse::<i32>().unwrap();
|
||||
let key = (n(1), n(2), n(3));
|
||||
let Some(e) = world.block_entities.get(&key) else {
|
||||
continue;
|
||||
};
|
||||
let mut slots: Vec<String> = e
|
||||
.slots()
|
||||
.iter()
|
||||
.map(|s| s.as_ref().map_or("-".into(), stack))
|
||||
.collect();
|
||||
while slots.last().is_some_and(|s| s == "-") {
|
||||
slots.pop();
|
||||
}
|
||||
let count = world.chest_openers.get(&key).map_or(0, |o| o.0);
|
||||
let _ = writeln!(
|
||||
out,
|
||||
"{t} chest {},{},{} {} {count}",
|
||||
key.0 - s.origin[0],
|
||||
key.1,
|
||||
key.2 - s.origin[1],
|
||||
if slots.is_empty() {
|
||||
"-".into()
|
||||
} else {
|
||||
slots.join(",")
|
||||
}
|
||||
);
|
||||
}
|
||||
for line in traces {
|
||||
let _ = writeln!(out, "{line}");
|
||||
}
|
||||
}
|
||||
}
|
||||
fs::write(&args[2], out)?;
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
//! The resource pack screen for tools/test_pack_screen_parity.py: reads one
|
||||
//! JSON case per line (packs, selection, GUI size, actions, mouse), runs
|
||||
//! `horizon_client::pack_screen` through the actions and writes the shown
|
||||
//! screen's GUI calls in the oracle's JSON form.
|
||||
//!
|
||||
//! usage: pack_screen_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::{
|
||||
hud::HudAtlas,
|
||||
lang,
|
||||
pack_screen::{Compat, PackInfo, PackScreen, Source},
|
||||
packs::{self, Position},
|
||||
screen_draw::{Draw, Measure},
|
||||
text::Text,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fmt::Write as _, fs, path::PathBuf};
|
||||
|
||||
/// Styled runs: [text, rgb or null, bold, italic, underlined, strikethrough, obfuscated].
|
||||
pub fn runs(t: &Text) -> Value {
|
||||
let mut out: Vec<(String, Option<u32>, [bool; 5])> = Vec::new();
|
||||
for (c, s) in t.chars() {
|
||||
let f = [
|
||||
s.bold,
|
||||
s.italic,
|
||||
s.underlined,
|
||||
s.strikethrough,
|
||||
s.obfuscated,
|
||||
]
|
||||
.map(|b| b == Some(true));
|
||||
match out.last_mut() {
|
||||
Some(last) if last.1 == s.color && last.2 == f => last.0.push(c),
|
||||
_ => out.push((c.to_string(), s.color, f)),
|
||||
}
|
||||
}
|
||||
Value::Array(
|
||||
out.into_iter()
|
||||
.map(|(t, c, f)| json!([t, c, f[0], f[1], f[2], f[3], f[4]]))
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
pub fn encode(draws: &[Draw]) -> Value {
|
||||
Value::Array(
|
||||
draws
|
||||
.iter()
|
||||
.map(|d| match d {
|
||||
Draw::Sprite { sprite, x, y, w, h, color } => {
|
||||
json!({"type": "sprite", "sprite": sprite, "x": x, "y": y, "w": w, "h": h, "color": color})
|
||||
}
|
||||
Draw::Blit { texture, x, y, w, h, u, v, src, tex, color } => json!({"type": "blit", "texture": texture,
|
||||
"x": x, "y": y, "w": w, "h": h, "u": u, "v": v, "srcW": src[0], "srcH": src[1], "texW": tex[0],
|
||||
"texH": tex[1], "color": color}),
|
||||
Draw::Fill { x0, y0, x1, y1, color } => {
|
||||
json!({"type": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1, "color": color})
|
||||
}
|
||||
Draw::Highlight { x0, y0, x1, y1 } => json!({"type": "highlight", "x0": x0, "y0": y0, "x1": x1, "y1": y1}),
|
||||
Draw::Text { text, x, y, color, shadow } => {
|
||||
json!({"type": "text", "runs": runs(text), "x": x, "y": y, "color": color, "shadow": shadow})
|
||||
}
|
||||
Draw::Scissor { x0, y0, x1, y1 } => json!({"type": "scissor", "x0": x0, "y0": y0, "x1": x1, "y1": y1}),
|
||||
Draw::NoScissor => json!({"type": "noscissor"}),
|
||||
Draw::Tooltip { lines, x, y } => {
|
||||
json!({"type": "tooltip", "lines": lines.iter().map(runs).collect::<Vec<_>>(), "x": x, "y": y})
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [root, inputs, output] = args.as_slice() else {
|
||||
return Err("usage: pack_screen_fixture RESOURCES CASES OUTPUT".into());
|
||||
};
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
lang::set(lang::Language::load(&[root], lang::DEFAULT));
|
||||
let m = Measure(&atlas.font);
|
||||
let mut out = String::new();
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let int = |v: &Value| v.as_i64().unwrap_or(0) as i32;
|
||||
let packs: Vec<PackInfo> = c["packs"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|p| {
|
||||
let (description, description_style) = packs::component_root(&p["description"]);
|
||||
PackInfo {
|
||||
id: p["id"].as_str().unwrap_or_default().to_owned(),
|
||||
title: packs::component_root(&p["title"]).0,
|
||||
description,
|
||||
description_style,
|
||||
source: match p["source"].as_str() {
|
||||
Some("builtin") => Source::BuiltIn,
|
||||
Some("world") => Source::World,
|
||||
Some("server") => Source::Server,
|
||||
Some("feature") => Source::Feature,
|
||||
_ => Source::Default,
|
||||
},
|
||||
compat: match p["compat"].as_str() {
|
||||
Some("old") => Compat::TooOld,
|
||||
Some("new") => Compat::TooNew,
|
||||
Some("unknown") => Compat::Unknown,
|
||||
_ => Compat::Compatible,
|
||||
},
|
||||
icon: p["icon"].as_bool().unwrap_or(false),
|
||||
required: p["required"].as_bool().unwrap_or(false),
|
||||
position: if p["position"] == "top" {
|
||||
Position::Top
|
||||
} else {
|
||||
Position::Bottom
|
||||
},
|
||||
fixed: p["fixed"].as_bool().unwrap_or(false),
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
let selected: Vec<String> = c["selected"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|s| s.as_str().map(str::to_owned))
|
||||
.collect();
|
||||
let mut screen = PackScreen::new(
|
||||
&m,
|
||||
int(&c["width"]),
|
||||
int(&c["height"]),
|
||||
c["inWorld"] == true,
|
||||
packs,
|
||||
&selected,
|
||||
);
|
||||
for a in c["actions"].as_array().into_iter().flatten() {
|
||||
let f = |k: &str| a[k].as_f64().unwrap_or(0.0);
|
||||
match a["type"].as_str().unwrap_or_default() {
|
||||
"click" => {
|
||||
screen.click(&m, f("x"), f("y"));
|
||||
}
|
||||
"scroll" => screen.scroll(f("x"), f("y"), f("amount")),
|
||||
"type" => screen.type_text(&m, a["text"].as_str().unwrap_or_default()),
|
||||
"erase" => screen.erase(&m, f("count") as isize),
|
||||
_ => {}
|
||||
}
|
||||
if std::env::var_os("PACK_DEBUG").is_some() {
|
||||
eprintln!("{a} -> {}", screen.debug());
|
||||
}
|
||||
}
|
||||
let mouse = (int(&c["mouse"][0]), int(&c["mouse"][1]));
|
||||
let draws = screen.draw(&m, mouse, c["blink"].as_u64().unwrap_or(0));
|
||||
let screen_name = if screen.confirming() {
|
||||
"confirm"
|
||||
} else {
|
||||
"packs"
|
||||
};
|
||||
writeln!(
|
||||
out,
|
||||
"{}",
|
||||
json!({"screen": screen_name, "draws": encode(&draws)})
|
||||
)?;
|
||||
}
|
||||
fs::write(output, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
//! Headless transport for the pack selection parity gate: builds each
|
||||
//! case's `horizon_client::packs::SelectionModel`, applies its actions and
|
||||
//! writes both lists with each entry's select/unselect/move flags after
|
||||
//! every action, and the committed selection.
|
||||
#![forbid(unsafe_code)]
|
||||
use horizon_client::packs::{Position, Selectable, SelectionModel};
|
||||
use serde_json::{Value, json};
|
||||
use std::{
|
||||
fs,
|
||||
io::{BufWriter, Write},
|
||||
path::PathBuf,
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
fn lists(m: &SelectionModel) -> Value {
|
||||
let side = |selected: bool| -> Value {
|
||||
let list = if selected { &m.selected } else { &m.unselected };
|
||||
(0..list.len())
|
||||
.map(|i| {
|
||||
let mut flags = String::new();
|
||||
for (on, c) in [
|
||||
(m.can_select(selected, i), 's'),
|
||||
(m.can_unselect(selected, i), 'u'),
|
||||
(m.can_move_up(selected, i), '^'),
|
||||
(m.can_move_down(selected, i), 'v'),
|
||||
] {
|
||||
if on {
|
||||
flags.push(c);
|
||||
}
|
||||
}
|
||||
json!([list[i].id, flags])
|
||||
})
|
||||
.collect()
|
||||
};
|
||||
json!({"unselected": side(false), "selected": side(true)})
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [inputs, output] = args.as_slice() else {
|
||||
return Err("usage: pack_selection_fixture INPUTS OUTPUT".into());
|
||||
};
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let packs = c["packs"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|p| Selectable {
|
||||
id: p["id"].as_str().unwrap_or("").to_owned(),
|
||||
required: p["required"].as_bool().unwrap_or(false),
|
||||
position: if p["position"] == "top" {
|
||||
Position::Top
|
||||
} else {
|
||||
Position::Bottom
|
||||
},
|
||||
fixed: p["fixed"].as_bool().unwrap_or(false),
|
||||
compatible: p["compat"] == "compatible",
|
||||
})
|
||||
.collect();
|
||||
let selected: Vec<String> = c["selected"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|s| s.as_str().map(str::to_owned))
|
||||
.collect();
|
||||
let mut m = SelectionModel::new(packs, &selected);
|
||||
let mut steps = vec![lists(&m)];
|
||||
for op in c["ops"].as_array().into_iter().flatten() {
|
||||
let sel = op["list"] == "selected";
|
||||
let len = if sel {
|
||||
m.selected.len()
|
||||
} else {
|
||||
m.unselected.len()
|
||||
};
|
||||
if len > 0 {
|
||||
let i = op["index"].as_i64().unwrap_or(0).rem_euclid(len as i64) as usize;
|
||||
match op["op"].as_str() {
|
||||
Some("activate") => {
|
||||
m.activate(sel, i, op["confirm"].as_bool().unwrap_or(false));
|
||||
}
|
||||
Some("up") => {
|
||||
m.move_by(sel, i, true);
|
||||
}
|
||||
Some("down") => {
|
||||
m.move_by(sel, i, false);
|
||||
}
|
||||
_ => return Err(format!("unknown op {op}").into()),
|
||||
}
|
||||
}
|
||||
steps.push(lists(&m));
|
||||
}
|
||||
writeln!(out, "{}", json!({"steps": steps, "committed": m.commit()}))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
//! Recipe book placements for tools/test_place_recipe_parity.py: reads one
|
||||
//! JSON case per line (menu, inventory, grid, recipe, max, creative,
|
||||
//! selected) and the oracle's order of the counted items, runs
|
||||
//! `Menu::place_recipe` and prints the oracle's line.
|
||||
//!
|
||||
//! usage: place_recipe_fixture RESOURCES CASES ORDERS OUTPUT
|
||||
use horizon_client::{
|
||||
crafting::Recipes,
|
||||
item_data::{canon_stack, parse_stack},
|
||||
items::Items,
|
||||
menu::{Env, Kind, Menu, place::PostPlace},
|
||||
};
|
||||
use serde_json::Value;
|
||||
use std::{fs, path::Path};
|
||||
|
||||
fn state(menu: &Menu) -> String {
|
||||
let slots: Vec<String> = (0..menu.slot_count())
|
||||
.map(|i| canon_stack(menu.slot(i)))
|
||||
.collect();
|
||||
let data: String = menu.data.iter().map(|d| format!(" {d}")).collect();
|
||||
let inv: Vec<String> = (0..41).map(|i| canon_stack(menu.player_item(i))).collect();
|
||||
format!(
|
||||
"{} | {} |{data} | {} | inv {}",
|
||||
slots.join(" "),
|
||||
canon_stack(menu.carried.as_ref()),
|
||||
menu.drops.join(";"),
|
||||
inv.join(" ")
|
||||
)
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: place_recipe_fixture RESOURCES CASES ORDERS OUTPUT";
|
||||
let root = Path::new(args.get(1).ok_or(usage)?);
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let orders = fs::read_to_string(args.get(3).ok_or(usage)?)?;
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let brewing = horizon_client::brewing::Brewing::load(root, &items);
|
||||
let banners = horizon_client::banner::Banners::default();
|
||||
let env = Env {
|
||||
items: &items,
|
||||
recipes: &recipes,
|
||||
brewing: &brewing,
|
||||
banners: &banners,
|
||||
};
|
||||
let mut out = String::new();
|
||||
for (line, order) in cases.lines().zip(orders.lines()) {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let kind = Kind::parse(case["menu"].as_str().unwrap_or_default()).ok_or("menu kind")?;
|
||||
let mut menu = Menu::new(kind);
|
||||
menu.creative = case["creative"].as_bool().unwrap_or(false);
|
||||
menu.selected = case["selected"].as_u64().unwrap_or(0) as usize;
|
||||
for pair in case["inventory"].as_array().ok_or("inventory")? {
|
||||
menu.set_player_item(
|
||||
pair[0].as_u64().unwrap_or(0) as usize,
|
||||
parse_stack(pair[1].as_str().unwrap_or("-"))?,
|
||||
);
|
||||
}
|
||||
for pair in case["grid"].as_array().ok_or("grid")? {
|
||||
menu.set_slot(
|
||||
&env,
|
||||
pair[0].as_u64().unwrap_or(0) as usize,
|
||||
parse_stack(pair[1].as_str().unwrap_or("-"))?,
|
||||
);
|
||||
}
|
||||
menu.drops.clear();
|
||||
let order: Vec<String> = order.split_whitespace().map(str::to_owned).collect();
|
||||
let recipe = case["recipe"].as_str().unwrap_or_default();
|
||||
let impossible = recipes.placement(recipe).is_none_or(|p| p.impossible());
|
||||
let post = if impossible {
|
||||
"-"
|
||||
} else {
|
||||
match menu.place_recipe(
|
||||
&env,
|
||||
recipe,
|
||||
case["max"].as_bool().unwrap_or(false),
|
||||
menu.creative,
|
||||
Some(&order),
|
||||
) {
|
||||
PostPlace::Nothing => "NOTHING",
|
||||
PostPlace::Ghost => "PLACE_GHOST_RECIPE",
|
||||
}
|
||||
};
|
||||
out += &format!("post {post} | {}\n", state(&menu));
|
||||
}
|
||||
fs::write(args.get(4).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,143 @@
|
||||
//! The player's recipe book for tools/test_recipe_book_parity.py: reads one
|
||||
//! JSON case per line (a list of give / take / seen / set / save / load ops)
|
||||
//! and prints the oracle's line after each op, from
|
||||
//! `horizon_client::recipe_book::{Settings, RecipeIndex}`.
|
||||
//!
|
||||
//! usage: recipe_book_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::recipe_book::{BookType, RecipeIndex, Settings};
|
||||
use horizon_world::nbt::Tag;
|
||||
use serde_json::Value;
|
||||
use std::{collections::BTreeSet, fs, path::Path};
|
||||
|
||||
fn fnv<'a>(ids: impl IntoIterator<Item = &'a String>) -> u64 {
|
||||
let mut sorted: Vec<&String> = ids.into_iter().collect();
|
||||
sorted.sort();
|
||||
let joined = sorted
|
||||
.iter()
|
||||
.map(|s| s.as_str())
|
||||
.collect::<Vec<_>>()
|
||||
.join(",");
|
||||
let mut h: u64 = 0xcbf2_9ce4_8422_2325;
|
||||
for b in joined.bytes() {
|
||||
h ^= u64::from(b);
|
||||
h = h.wrapping_mul(0x0100_0000_01b3);
|
||||
}
|
||||
h
|
||||
}
|
||||
fn ids(set: &BTreeSet<String>) -> String {
|
||||
format!("{}:{:x}", set.len(), fnv(set))
|
||||
}
|
||||
/// The saved compound as the oracle prints it: keys sorted, lists hashed.
|
||||
fn compound(tag: &Tag) -> String {
|
||||
let Tag::Compound(c) = tag else {
|
||||
return String::new();
|
||||
};
|
||||
let mut keys: Vec<String> = c.keys().map(|k| k.to_string_lossy()).collect();
|
||||
keys.sort();
|
||||
let mut out = String::new();
|
||||
for k in keys {
|
||||
out.push(' ');
|
||||
out.push_str(&k);
|
||||
out.push('=');
|
||||
match tag.get(&k) {
|
||||
Some(Tag::List(list)) => {
|
||||
let v: Vec<String> = list
|
||||
.iter()
|
||||
.map(|t| match t {
|
||||
Tag::String(s) => s.to_string_lossy(),
|
||||
_ => "?".into(),
|
||||
})
|
||||
.collect();
|
||||
out.push_str(&format!("{}:{:x}", v.len(), fnv(&v)));
|
||||
}
|
||||
Some(Tag::Byte(b)) => out.push_str(&format!("{b}b")),
|
||||
_ => out.push('?'),
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: recipe_book_fixture RESOURCES CASES OUTPUT";
|
||||
let root = Path::new(args.get(1).ok_or(usage)?);
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let index = RecipeIndex::load(root);
|
||||
let mut out = String::new();
|
||||
for line in cases.lines() {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let mut book = Settings::default();
|
||||
let mut saved: Option<Tag> = None;
|
||||
for op in case["ops"].as_array().ok_or("ops")? {
|
||||
let kind = op["op"].as_str().unwrap_or_default();
|
||||
let list = || -> Vec<String> {
|
||||
op["ids"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|v| v.as_str().map(str::to_owned))
|
||||
.filter(|id| index.contains(id))
|
||||
.collect()
|
||||
};
|
||||
let mut count = 0;
|
||||
let mut extra = String::new();
|
||||
match kind {
|
||||
"give" => count = book.add_recipes(&index, &list()).0,
|
||||
"take" => count = book.remove_recipes(&index, &list()),
|
||||
"seen" => book.remove_highlight(op["id"].as_str().unwrap_or_default()),
|
||||
"set" => {
|
||||
let i = match op["type"].as_str().unwrap_or_default() {
|
||||
"CRAFTING" => BookType::Crafting,
|
||||
"FURNACE" => BookType::Furnace,
|
||||
"BLAST_FURNACE" => BookType::BlastFurnace,
|
||||
_ => BookType::Smoker,
|
||||
}
|
||||
.index();
|
||||
book.open[i] = op["open"].as_bool().unwrap_or(false);
|
||||
book.filtering[i] = op["filtering"].as_bool().unwrap_or(false);
|
||||
}
|
||||
"save" => {
|
||||
let tag = book.write();
|
||||
extra = compound(&tag);
|
||||
saved = Some(tag);
|
||||
}
|
||||
"load" => {
|
||||
let mut tag = saved
|
||||
.clone()
|
||||
.unwrap_or_else(|| Tag::Compound(Default::default()));
|
||||
if let Tag::Compound(c) = &mut tag {
|
||||
for name in ["recipes", "toBeDisplayed"] {
|
||||
if let Some(Tag::List(l)) = c.get_mut(&name.into()) {
|
||||
l.push(Tag::String("minecraft:no_such_recipe".into()));
|
||||
l.push(Tag::String("stick".into()));
|
||||
}
|
||||
}
|
||||
if let Some(drop) = op["drop"].as_str() {
|
||||
c.remove(&drop.into());
|
||||
}
|
||||
}
|
||||
book = Settings::read_valid(Some(&tag), &|id| index.contains(id));
|
||||
}
|
||||
other => return Err(format!("op {other}").into()),
|
||||
}
|
||||
let settings: String = BookType::ALL
|
||||
.iter()
|
||||
.map(|b| {
|
||||
format!(
|
||||
"{}{}",
|
||||
u8::from(book.open[b.index()]),
|
||||
u8::from(book.filtering[b.index()])
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
out += &format!(
|
||||
"{kind} {count} known={} highlight={} settings={settings}{extra}\n",
|
||||
ids(&book.recipes),
|
||||
ids(&book.to_be_displayed)
|
||||
);
|
||||
}
|
||||
out += "end\n";
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
//! The recipe book's drawing, for tools/test_recipe_book_render_parity.py:
|
||||
//! reads one JSON case per line (book type, GUI size, tabs, search box,
|
||||
//! filter, recipe collections and page, overlay, ghost slots, cycling index,
|
||||
//! mouse) and writes the calls `horizon_client::recipe_book_screen` makes,
|
||||
//! in the oracle's JSON form.
|
||||
//!
|
||||
//! usage: recipe_book_render_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::{
|
||||
crafting::Recipes,
|
||||
hud::{HudAtlas, HudBatch},
|
||||
items::{ItemStack, Items},
|
||||
lang,
|
||||
recipe_book::{Book, BookType, Entry},
|
||||
recipe_book_screen::{
|
||||
ButtonView, Call, GhostView, ItemCall, OverlayRecipe, OverlayView, Run, Screen, Search,
|
||||
TabView, draw, overlay_cells, overlay_origin,
|
||||
},
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fmt::Write as _, fs, path::Path};
|
||||
|
||||
fn runs(r: &[Run]) -> Value {
|
||||
Value::Array(
|
||||
r.iter()
|
||||
.map(|r| json!([r.text, r.color, r.italic]))
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
fn round(v: f32) -> f32 {
|
||||
(v * 1e4).round() / 1e4
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: recipe_book_render_fixture RESOURCES CASES OUTPUT";
|
||||
let root = Path::new(args.get(1).ok_or(usage)?);
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let book = Book::build(&recipes, &items);
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
let root_buf = root.to_path_buf();
|
||||
lang::set(lang::Language::load(&[&root_buf], lang::DEFAULT));
|
||||
let translate = |key: &str| lang::get(key);
|
||||
let text_width = |s: &str| HudBatch::text_width(&atlas, s) as i32;
|
||||
let mut out = String::new();
|
||||
for line in cases.lines() {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let int = |v: &Value| v.as_i64().unwrap_or(0) as i32;
|
||||
let kind = match case["type"].as_str().unwrap_or_default() {
|
||||
"crafting" => BookType::Crafting,
|
||||
"furnace" => BookType::Furnace,
|
||||
"blast_furnace" => BookType::BlastFurnace,
|
||||
_ => BookType::Smoker,
|
||||
};
|
||||
let filtering = case["filtering"].as_bool().unwrap_or(false);
|
||||
let tab_list = kind.tabs();
|
||||
let tabs: Vec<TabView> = case["tabs"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|t| {
|
||||
let (a, b) = tab_list[t["tab"].as_u64().unwrap_or(0) as usize].icons();
|
||||
TabView {
|
||||
icons: (a.to_owned(), b.map(str::to_owned)),
|
||||
selected: t["selected"].as_bool().unwrap_or(false),
|
||||
anim: t["anim"].as_f64().unwrap_or(0.0) as f32,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
let s = &case["search"];
|
||||
let search = Search {
|
||||
value: s["value"].as_str().unwrap_or_default().to_owned(),
|
||||
cursor: s["cursor"].as_u64().unwrap_or(0) as usize,
|
||||
highlight: s["highlight"].as_u64().unwrap_or(0) as usize,
|
||||
display: s["display"].as_u64().unwrap_or(0) as usize,
|
||||
focused: s["focused"].as_bool().unwrap_or(false),
|
||||
blink_ms: s["blink"].as_u64().unwrap_or(0),
|
||||
};
|
||||
// Each collection's recipes and craftable flags.
|
||||
let collections: Vec<Vec<(&Entry, bool)>> = case["collections"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|c| {
|
||||
c["recipes"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|r| Some((book.entry(r[0].as_str()?)?, r[1].as_bool()?)))
|
||||
.collect()
|
||||
})
|
||||
.collect();
|
||||
let page = case["page"].as_u64().unwrap_or(0) as usize;
|
||||
let pages = collections.len().div_ceil(20);
|
||||
let anims = case["buttonAnims"].as_array().cloned().unwrap_or_default();
|
||||
let shown = &collections[(20 * page).min(collections.len())..];
|
||||
let buttons: Vec<ButtonView> = shown
|
||||
.iter()
|
||||
.take(20)
|
||||
.enumerate()
|
||||
.map(|(i, c)| ButtonView {
|
||||
has_craftable: c.iter().any(|e| e.1),
|
||||
entries: c
|
||||
.iter()
|
||||
.filter(|e| e.1 || !filtering)
|
||||
.map(|e| vec![e.0.result.clone()])
|
||||
.collect(),
|
||||
anim: anims.get(i).and_then(Value::as_f64).unwrap_or(0.0) as f32,
|
||||
})
|
||||
.collect();
|
||||
let (xo, yo) = Screen {
|
||||
book: kind,
|
||||
width: int(&case["width"]),
|
||||
height: int(&case["height"]),
|
||||
narrow: case["narrow"].as_bool().unwrap_or(false),
|
||||
mouse: (0, 0),
|
||||
index: 0,
|
||||
filtering,
|
||||
search: &search,
|
||||
tabs: &[],
|
||||
buttons: &[],
|
||||
page,
|
||||
pages,
|
||||
overlay: None,
|
||||
ghost: None,
|
||||
translate: &translate,
|
||||
text_width: &text_width,
|
||||
}
|
||||
.origin();
|
||||
let overlay = case["overlay"].as_u64().map(|i| {
|
||||
let i = i as usize;
|
||||
let c = &shown[i];
|
||||
let mut recipes: Vec<OverlayRecipe> = c
|
||||
.iter()
|
||||
.filter(|e| e.1)
|
||||
.map(|e| OverlayRecipe {
|
||||
craftable: true,
|
||||
cells: overlay_cells(&book, e.0),
|
||||
})
|
||||
.collect();
|
||||
if !filtering {
|
||||
recipes.extend(c.iter().filter(|e| !e.1).map(|e| OverlayRecipe {
|
||||
craftable: false,
|
||||
cells: overlay_cells(&book, e.0),
|
||||
}));
|
||||
}
|
||||
let (x, y) = overlay_origin(
|
||||
xo + 11 + 25 * (i as i32 % 5),
|
||||
yo + 31 + 25 * (i as i32 / 5),
|
||||
recipes.len(),
|
||||
xo,
|
||||
yo,
|
||||
);
|
||||
OverlayView { x, y, recipes }
|
||||
});
|
||||
let ghosts: Vec<GhostView> = case["ghost"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|g| GhostView {
|
||||
x: int(&g["x"]),
|
||||
y: int(&g["y"]),
|
||||
result: g["result"].as_bool().unwrap_or(false),
|
||||
items: g["items"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(Value::as_str)
|
||||
.map(|i| ItemStack::new(i, 1))
|
||||
.collect(),
|
||||
})
|
||||
.collect();
|
||||
let screen = Screen {
|
||||
book: kind,
|
||||
width: int(&case["width"]),
|
||||
height: int(&case["height"]),
|
||||
narrow: case["narrow"].as_bool().unwrap_or(false),
|
||||
mouse: (int(&case["mouse"][0]), int(&case["mouse"][1])),
|
||||
index: case["index"].as_u64().unwrap_or(0) as usize,
|
||||
filtering,
|
||||
search: &search,
|
||||
tabs: &tabs,
|
||||
buttons: &buttons,
|
||||
page,
|
||||
pages,
|
||||
overlay: overlay.as_ref(),
|
||||
ghost: case.get("ghost").map(|_| {
|
||||
(
|
||||
int(&case["left"]),
|
||||
int(&case["top"]),
|
||||
case["big"].as_bool().unwrap_or(false),
|
||||
ghosts.as_slice(),
|
||||
)
|
||||
}),
|
||||
translate: &translate,
|
||||
text_width: &text_width,
|
||||
};
|
||||
let draws: Vec<Value> = draw(&screen)
|
||||
.into_iter()
|
||||
.filter_map(|d| {
|
||||
let m: Vec<f32> = d.pose.iter().map(|v| round(*v)).collect();
|
||||
let mut o = match d.call {
|
||||
Call::Blit {
|
||||
texture,
|
||||
x,
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
u,
|
||||
v,
|
||||
tw,
|
||||
th,
|
||||
} => json!({"t": "blit", "texture": texture, "x": x, "y": y, "w": w, "h": h,
|
||||
"u": u, "v": v, "tw": tw, "th": th}),
|
||||
Call::Sprite { id, x, y, w, h } => {
|
||||
json!({"t": "sprite", "id": id, "x": x, "y": y, "w": w, "h": h})
|
||||
}
|
||||
Call::Fill {
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
y1,
|
||||
color,
|
||||
} => json!({"t": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1, "color": color}),
|
||||
Call::Highlight { x0, y0, x1, y1 } => {
|
||||
json!({"t": "highlight", "x0": x0, "y0": y0, "x1": x1, "y1": y1})
|
||||
}
|
||||
Call::Text {
|
||||
runs: r,
|
||||
x,
|
||||
y,
|
||||
color,
|
||||
shadow,
|
||||
} => json!({"t": "text", "runs": runs(&r), "x": x, "y": y, "color": color, "shadow": shadow}),
|
||||
Call::Item { call, stack, x, y } => {
|
||||
if stack.count == 0 || &*stack.item == "minecraft:air" {
|
||||
return None;
|
||||
}
|
||||
let t = match call {
|
||||
ItemCall::Item => "item",
|
||||
ItemCall::Fake => "fake",
|
||||
ItemCall::Decorations => "decorations",
|
||||
};
|
||||
json!({"t": t, "id": &*stack.item, "count": stack.count, "x": x, "y": y})
|
||||
}
|
||||
Call::Tooltip(lines) => {
|
||||
json!({"t": "tooltip", "lines": lines.iter().map(|l| runs(l)).collect::<Vec<_>>()})
|
||||
}
|
||||
Call::ItemTooltip { stack, more } => {
|
||||
json!({"t": "item_tooltip", "id": &*stack.item, "more": more})
|
||||
}
|
||||
Call::Stratum => json!({"t": "stratum"}),
|
||||
};
|
||||
o["m"] = json!(m);
|
||||
Some(o)
|
||||
})
|
||||
.collect();
|
||||
let _ = writeln!(out, "{}", json!({ "draws": draws }));
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
//! What the recipe book lists, for tools/test_recipe_book_view_parity.py:
|
||||
//! reads one JSON case per line (the history of displays the client was
|
||||
//! sent, the book type and grid, the inventory and menu slots, the filter)
|
||||
//! and prints every tab's visibility, page count and buttons from
|
||||
//! `horizon_client::recipe_book::ClientBook`.
|
||||
//!
|
||||
//! usage: recipe_book_view_fixture RESOURCES CASES OUTPUT
|
||||
use horizon_client::{
|
||||
crafting::Recipes,
|
||||
item_data::parse_stack,
|
||||
items::Items,
|
||||
menu::place::Stacked,
|
||||
recipe_book::{Book, BookType, ClientBook, Display, RecipeIndex, Tab},
|
||||
};
|
||||
use serde_json::Value;
|
||||
use std::{fmt::Write as _, fs, path::Path};
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: recipe_book_view_fixture RESOURCES CASES OUTPUT";
|
||||
let root = Path::new(args.get(1).ok_or(usage)?);
|
||||
let cases = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let items = Items::catalog(root)?;
|
||||
let recipes = Recipes::load(root, &items)?;
|
||||
let index = RecipeIndex::load(root);
|
||||
let mut book = Book::build(&recipes, &items);
|
||||
book.set_display_ids(&index);
|
||||
let max = |s: &horizon_client::items::ItemStack| items.get(&s.item).map_or(64, |i| i.max_stack);
|
||||
let names = horizon_client::creative::Names::load(root);
|
||||
let translate = |k: &str| names.get(k).map(str::to_owned);
|
||||
let tooltip = |s: &horizon_client::items::ItemStack| {
|
||||
horizon_client::item_tooltip::lines(s, items.get(&s.item), &translate)
|
||||
};
|
||||
let mut out = String::new();
|
||||
for line in cases.lines() {
|
||||
let case: Value = serde_json::from_str(line)?;
|
||||
let mut client = ClientBook::default();
|
||||
for batch in case["history"].as_array().ok_or("history")? {
|
||||
let op = batch["op"].as_str().unwrap_or_default();
|
||||
if op == "replace" {
|
||||
client.clear();
|
||||
}
|
||||
for id in batch["ids"].as_array().into_iter().flatten() {
|
||||
for d in index.display_ids(id.as_str().unwrap_or_default()) {
|
||||
if op == "remove" {
|
||||
client.remove(d);
|
||||
} else {
|
||||
client.add(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let kind = case["type"].as_str().unwrap_or_default();
|
||||
let grid = case["grid"].as_u64().unwrap_or(3) as usize;
|
||||
let mut stock = Stacked::default();
|
||||
for s in case["inventory"].as_array().into_iter().flatten() {
|
||||
if let Some(stack) = parse_stack(s.as_str().unwrap_or("-"))? {
|
||||
stock.account_simple(&stack, max(&stack));
|
||||
}
|
||||
}
|
||||
for s in case["slots"].as_array().into_iter().flatten() {
|
||||
if let Some(stack) = parse_stack(s.as_str().unwrap_or("-"))? {
|
||||
if kind == "crafting" {
|
||||
stock.account_simple(&stack, max(&stack));
|
||||
} else {
|
||||
stock.account_stack(&stack, max(&stack));
|
||||
}
|
||||
}
|
||||
}
|
||||
let book_type = match kind {
|
||||
"crafting" => BookType::Crafting,
|
||||
"furnace" => BookType::Furnace,
|
||||
"blast_furnace" => BookType::BlastFurnace,
|
||||
_ => BookType::Smoker,
|
||||
};
|
||||
let filtering = case["filtering"].as_bool().unwrap_or(false);
|
||||
let query = case["search"].as_str().unwrap_or_default();
|
||||
for tab in book_type.tabs() {
|
||||
let collections = client.collections(&book, book_type, tab);
|
||||
let selected = |i: usize| match (&book.entries[i].display, book_type) {
|
||||
(Display::Furnace(_), BookType::Crafting) => false,
|
||||
(Display::Furnace(_), _) => true,
|
||||
(_, BookType::Crafting) => book.entries[i].fits(grid, grid),
|
||||
_ => false,
|
||||
};
|
||||
let craftable = |i: usize| selected(i) && book.can_craft(&book.entries[i], &stock);
|
||||
let visible = tab == Tab::Search
|
||||
|| collections
|
||||
.iter()
|
||||
.any(|c| c.entries.iter().any(|&i| selected(i)));
|
||||
let shown: Vec<_> = collections
|
||||
.iter()
|
||||
.filter(|c| c.entries.iter().any(|&i| selected(i)))
|
||||
.filter(|c| {
|
||||
query.is_empty() || book.collection_matches(&c.entries, query, &tooltip)
|
||||
})
|
||||
.filter(|c| !filtering || c.entries.iter().any(|&i| craftable(i)))
|
||||
.collect();
|
||||
let name = match tab {
|
||||
Tab::Search => "search".to_owned(),
|
||||
Tab::Category(c) => c.name().to_owned(),
|
||||
};
|
||||
let _ = write!(
|
||||
out,
|
||||
"{name} {} pages={}",
|
||||
if visible { "shown" } else { "hidden" },
|
||||
shown.len().div_ceil(20)
|
||||
);
|
||||
for c in shown {
|
||||
let parts: Vec<String> = c
|
||||
.entries
|
||||
.iter()
|
||||
.map(|&i| {
|
||||
format!(
|
||||
"{}{}{}",
|
||||
book.entries[i].display_id,
|
||||
if selected(i) { "s" } else { "" },
|
||||
if craftable(i) { "c" } else { "" }
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
let _ = write!(out, " [{}]", parts.join(","));
|
||||
}
|
||||
out.push_str(" | ");
|
||||
}
|
||||
out.push('\n');
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,430 @@
|
||||
//! The scoreboard model for differential tests against vanilla's `Scoreboard`
|
||||
//! (tools/test_scoreboard_parity.py): runs the same scripted operations as
|
||||
//! VanillaScoreboardOracle on `horizon_client::scoreboard::Scoreboard` and
|
||||
//! prints the same JSON lines (results, dumps, the packed save data before
|
||||
//! and after reloading it). With a vanilla output file it also reloads each
|
||||
//! case's vanilla NBT and packs it again (`vreload`).
|
||||
//!
|
||||
//! usage: scoreboard_fixture REGISTRIES.json INPUTS OUTPUT [VANILLA_OUTPUT]
|
||||
use horizon_client::{
|
||||
command::Registries,
|
||||
scoreboard::{
|
||||
self as sb, CollisionRule, Comp, NumberFormat, RenderType, Scoreboard, Visibility,
|
||||
canonical_component, criteria_by_name, criteria_read_only, criteria_render_type,
|
||||
},
|
||||
};
|
||||
use horizon_world::nbt::{self, NamedTag, Tag};
|
||||
use serde_json::{Map, Value, json};
|
||||
use std::{collections::BTreeMap, fs, io::Write};
|
||||
|
||||
fn canon(tag: &Tag) -> Value {
|
||||
match tag {
|
||||
Tag::Compound(c) => {
|
||||
let sorted: BTreeMap<String, &Tag> =
|
||||
c.iter().map(|(k, v)| (k.to_string_lossy(), v)).collect();
|
||||
Value::Object(sorted.into_iter().map(|(k, v)| (k, canon(v))).collect())
|
||||
}
|
||||
Tag::List(l) => Value::Array(l.iter().map(canon).collect()),
|
||||
Tag::String(s) => Value::String(format!("'{}", s.to_string_lossy())),
|
||||
Tag::Byte(v) => Value::String(format!("{v}b")),
|
||||
Tag::Short(v) => Value::String(format!("{v}s")),
|
||||
Tag::Int(v) => Value::String(format!("{v}i")),
|
||||
Tag::Long(v) => Value::String(format!("{v}L")),
|
||||
Tag::Float(v) => Value::String(format!("f:{v:x}")),
|
||||
Tag::Double(v) => Value::String(format!("d:{v:x}")),
|
||||
Tag::IntArray(v) => json!({ "I;": v }),
|
||||
other => Value::String(format!("?{other:?}")),
|
||||
}
|
||||
}
|
||||
fn hex(bytes: &[u8]) -> String {
|
||||
bytes.iter().map(|b| format!("{b:02x}")).collect()
|
||||
}
|
||||
fn unhex(text: &str) -> Vec<u8> {
|
||||
(0..text.len())
|
||||
.step_by(2)
|
||||
.map(|i| u8::from_str_radix(&text[i..i + 2], 16).unwrap_or(0))
|
||||
.collect()
|
||||
}
|
||||
fn encode(tag: &Tag) -> Vec<u8> {
|
||||
nbt::write_named(
|
||||
&NamedTag {
|
||||
name: "".into(),
|
||||
tag: tag.clone(),
|
||||
},
|
||||
Default::default(),
|
||||
)
|
||||
.expect("nbt")
|
||||
}
|
||||
fn decode(bytes: &[u8]) -> Tag {
|
||||
nbt::read_named(bytes, Default::default())
|
||||
.expect("nbt")
|
||||
.0
|
||||
.tag
|
||||
}
|
||||
|
||||
fn comp(v: Option<&Value>) -> Option<Comp> {
|
||||
v.filter(|v| !v.is_null()).cloned()
|
||||
}
|
||||
fn comp_json(c: Option<&Comp>) -> Value {
|
||||
c.map_or(Value::Null, canonical_component)
|
||||
}
|
||||
fn fmt_json(f: Option<&NumberFormat>) -> Value {
|
||||
f.map_or(Value::Null, NumberFormat::to_json)
|
||||
}
|
||||
fn fmt(v: Option<&Value>) -> Option<NumberFormat> {
|
||||
v.filter(|v| !v.is_null()).and_then(NumberFormat::from_json)
|
||||
}
|
||||
fn s<'a>(op: &'a Value, k: &str) -> &'a str {
|
||||
op[k].as_str().unwrap_or_default()
|
||||
}
|
||||
|
||||
struct Fixture {
|
||||
reg: Registries,
|
||||
}
|
||||
impl Fixture {
|
||||
fn criteria(&self, name: &str) -> Value {
|
||||
match criteria_by_name(name, &self.reg) {
|
||||
Ok(Some(c)) => Value::String(c),
|
||||
Ok(None) => Value::Null,
|
||||
Err(_) => Value::String("!invalid".into()),
|
||||
}
|
||||
}
|
||||
fn dump(&self, b: &Scoreboard, probes: &[Value]) -> Value {
|
||||
let objectives: Vec<Value> = b
|
||||
.objectives
|
||||
.iter()
|
||||
.map(|o| {
|
||||
json!({
|
||||
"name": o.name, "criteria": o.criteria, "display": comp_json(Some(&o.display_name)),
|
||||
"render": o.render_type.id(), "auto": o.display_auto_update,
|
||||
"format": fmt_json(o.number_format.as_ref()),
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
let stream: Vec<Value> = b
|
||||
.objectives_streamed()
|
||||
.iter()
|
||||
.map(|o| Value::String(o.name.clone()))
|
||||
.collect();
|
||||
let tracked = b.tracked();
|
||||
let mut lists = Map::new();
|
||||
for o in &b.objectives {
|
||||
let rows: Vec<Value> = b
|
||||
.list_scores(&o.name)
|
||||
.iter()
|
||||
.map(|e| {
|
||||
json!([
|
||||
e.owner,
|
||||
e.value,
|
||||
comp_json(e.display.as_ref()),
|
||||
fmt_json(e.number_format.as_ref())
|
||||
])
|
||||
})
|
||||
.collect();
|
||||
lists.insert(o.name.clone(), Value::Array(rows));
|
||||
}
|
||||
let mut holders = Map::new();
|
||||
for h in &tracked {
|
||||
let mut per = Map::new();
|
||||
for o in &b.objectives {
|
||||
if let Some(sc) = b.score(h, &o.name) {
|
||||
per.insert(o.name.clone(), score_json(sc));
|
||||
}
|
||||
}
|
||||
holders.insert(h.clone(), Value::Object(per));
|
||||
}
|
||||
let teams: Vec<Value> = b
|
||||
.teams
|
||||
.iter()
|
||||
.map(|t| {
|
||||
json!({
|
||||
"name": t.name, "display": comp_json(Some(&t.display_name)), "color": t.color,
|
||||
"ff": t.allow_friendly_fire, "si": t.see_friendly_invisibles,
|
||||
"prefix": comp_json(Some(&t.prefix)), "suffix": comp_json(Some(&t.suffix)),
|
||||
"nametag": t.nametag_visibility.name(), "death": t.death_message_visibility.name(),
|
||||
"collision": t.collision_rule.name(),
|
||||
"players": t.players.iter().collect::<Vec<_>>(),
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
let teams_stream: Vec<Value> = b
|
||||
.teams_streamed()
|
||||
.iter()
|
||||
.map(|t| Value::String(t.name.clone()))
|
||||
.collect();
|
||||
let mut slots = Map::new();
|
||||
for slot in sb::display_slots() {
|
||||
if let Some(o) = b.display_objective(&slot) {
|
||||
slots.insert(slot, Value::String(o.name.clone()));
|
||||
}
|
||||
}
|
||||
let mut team_of = Map::new();
|
||||
for p in probes {
|
||||
let p = p.as_str().unwrap_or_default();
|
||||
team_of.insert(
|
||||
p.to_owned(),
|
||||
b.players_team(p)
|
||||
.map_or(Value::Null, |t| Value::String(t.name.clone())),
|
||||
);
|
||||
}
|
||||
json!({
|
||||
"objectives": objectives, "objectives_stream": stream, "tracked": tracked,
|
||||
"lists": lists, "holders": holders, "teams": teams, "teams_stream": teams_stream,
|
||||
"slots": slots, "team_of": team_of,
|
||||
})
|
||||
}
|
||||
fn apply(&self, b: &mut Scoreboard, op: &Value, probes: &[Value]) -> Value {
|
||||
let kind = s(op, "op");
|
||||
let holder = s(op, "holder");
|
||||
let dname = comp(op.get("dname"));
|
||||
match kind {
|
||||
"crit" => {
|
||||
let name = self.criteria(s(op, "name"));
|
||||
let mut o = json!({ "name": name });
|
||||
if let Some(n) = name.as_str().filter(|n| !n.starts_with('!')) {
|
||||
o["readonly"] = Value::Bool(criteria_read_only(n));
|
||||
o["render"] = Value::String(criteria_render_type(n).id().into());
|
||||
}
|
||||
o
|
||||
}
|
||||
"obj_add" => {
|
||||
let Some(criteria) = self
|
||||
.criteria(s(op, "criteria"))
|
||||
.as_str()
|
||||
.filter(|c| !c.starts_with('!'))
|
||||
.map(str::to_owned)
|
||||
else {
|
||||
return json!("bad");
|
||||
};
|
||||
if b.objective(s(op, "name")).is_some() {
|
||||
return json!("exists");
|
||||
}
|
||||
b.add_objective(
|
||||
s(op, "name"),
|
||||
&criteria,
|
||||
comp(op.get("display")).unwrap_or(Value::Null),
|
||||
RenderType::by_id(s(op, "render")),
|
||||
op["auto"].as_bool().unwrap_or(false),
|
||||
fmt(op.get("fmt")),
|
||||
);
|
||||
json!("ok")
|
||||
}
|
||||
"obj_rm" => {
|
||||
if b.objective(s(op, "name")).is_none() {
|
||||
return json!("missing");
|
||||
}
|
||||
b.remove_objective(s(op, "name"));
|
||||
json!("ok")
|
||||
}
|
||||
"obj_mod" => {
|
||||
let Some(o) = b.objective_mut(s(op, "name")) else {
|
||||
return json!("missing");
|
||||
};
|
||||
let v = &op["value"];
|
||||
match s(op, "field") {
|
||||
"display" => o.display_name = v.clone(),
|
||||
"render" => o.render_type = RenderType::by_id(v.as_str().unwrap_or_default()),
|
||||
"auto" => o.display_auto_update = v.as_bool().unwrap_or(false),
|
||||
"fmt" => o.number_format = fmt(Some(v)),
|
||||
other => panic!("field {other}"),
|
||||
}
|
||||
json!("ok")
|
||||
}
|
||||
"slot" => {
|
||||
let name = op["name"].as_str();
|
||||
if let Some(n) = name
|
||||
&& b.objective(n).is_none()
|
||||
{
|
||||
return json!("missing");
|
||||
}
|
||||
b.set_display_objective(s(op, "slot"), name);
|
||||
json!("ok")
|
||||
}
|
||||
"set" | "add" | "get" | "lock" | "unlock" | "sdisplay" | "sfmt" => {
|
||||
let name = s(op, "name");
|
||||
let Some(criteria) = b.objective(name).map(|o| o.criteria.clone()) else {
|
||||
return json!("missing");
|
||||
};
|
||||
let force = op["force"].as_bool().unwrap_or(false);
|
||||
let writable = force || !criteria_read_only(&criteria);
|
||||
let current = b.get(holder, name);
|
||||
match kind {
|
||||
"set" | "add" => {
|
||||
if !writable {
|
||||
return json!("readonly");
|
||||
}
|
||||
let value = op["value"].as_i64().unwrap_or(0) as i32;
|
||||
let new = if kind == "add" {
|
||||
current.wrapping_add(value)
|
||||
} else {
|
||||
value
|
||||
};
|
||||
b.set_with(holder, name, new, dname.as_ref());
|
||||
if kind == "add" {
|
||||
return json!(new);
|
||||
}
|
||||
}
|
||||
"get" => return json!(current),
|
||||
"lock" => b.score_mut(holder, name).locked = true,
|
||||
"unlock" => b.score_mut(holder, name).locked = false,
|
||||
"sdisplay" => b.score_mut(holder, name).display = comp(op.get("value")),
|
||||
"sfmt" => b.score_mut(holder, name).number_format = fmt(op.get("value")),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
json!("ok")
|
||||
}
|
||||
"info" => {
|
||||
let name = s(op, "name");
|
||||
if b.objective(name).is_none() {
|
||||
return json!("missing");
|
||||
}
|
||||
b.score(holder, name).map_or(Value::Null, score_json)
|
||||
}
|
||||
"reset" => {
|
||||
match op["name"].as_str() {
|
||||
None => b.reset_all(holder),
|
||||
Some(name) => {
|
||||
if b.objective(name).is_none() {
|
||||
return json!("missing");
|
||||
}
|
||||
b.reset_one(holder, name);
|
||||
}
|
||||
}
|
||||
json!("ok")
|
||||
}
|
||||
"all" => {
|
||||
let criteria = self.criteria(s(op, "criteria"));
|
||||
let criteria = criteria.as_str().unwrap_or_default();
|
||||
let value = op["value"].as_i64().unwrap_or(0) as i32;
|
||||
let k = s(op, "kind");
|
||||
b.for_all_objectives_with(criteria, holder, dname.as_ref(), |v| match k {
|
||||
"inc" => v.wrapping_add(1),
|
||||
"add" => v.wrapping_add(value),
|
||||
"set" => value,
|
||||
_ => 0,
|
||||
});
|
||||
json!("ok")
|
||||
}
|
||||
"team_add" => {
|
||||
if b.team(s(op, "name")).is_some() {
|
||||
return json!("exists");
|
||||
}
|
||||
b.add_team(s(op, "name"));
|
||||
json!("ok")
|
||||
}
|
||||
"team_rm" => {
|
||||
if b.team(s(op, "name")).is_none() {
|
||||
return json!("missing");
|
||||
}
|
||||
b.remove_team(s(op, "name"));
|
||||
json!("ok")
|
||||
}
|
||||
"join" => {
|
||||
if b.team(s(op, "team")).is_none() {
|
||||
return json!("missing");
|
||||
}
|
||||
json!(b.add_to_team(holder, s(op, "team")))
|
||||
}
|
||||
"leave" => json!(b.remove_from_team(holder)),
|
||||
"team_set" => {
|
||||
let Some(t) = b.team_mut(s(op, "name")) else {
|
||||
return json!("missing");
|
||||
};
|
||||
let v = &op["value"];
|
||||
let name = |v: &Value| v.as_str().unwrap_or_default().to_owned();
|
||||
match s(op, "field") {
|
||||
"display" => t.display_name = v.clone(),
|
||||
"color" => t.color = v.as_str().map(str::to_owned),
|
||||
"ff" => t.allow_friendly_fire = v.as_bool().unwrap_or(true),
|
||||
"si" => t.see_friendly_invisibles = v.as_bool().unwrap_or(true),
|
||||
"prefix" => t.prefix = comp(Some(v)).unwrap_or_else(|| sb::literal("")),
|
||||
"suffix" => t.suffix = comp(Some(v)).unwrap_or_else(|| sb::literal("")),
|
||||
"nametag" => {
|
||||
t.nametag_visibility = Visibility::by_name(&name(v)).expect("visibility")
|
||||
}
|
||||
"death" => {
|
||||
t.death_message_visibility =
|
||||
Visibility::by_name(&name(v)).expect("visibility")
|
||||
}
|
||||
"collision" => {
|
||||
t.collision_rule = CollisionRule::by_name(&name(v)).expect("collision")
|
||||
}
|
||||
other => panic!("field {other}"),
|
||||
}
|
||||
json!("ok")
|
||||
}
|
||||
"removed" => {
|
||||
b.entity_removed(holder);
|
||||
json!("ok")
|
||||
}
|
||||
"allied" => json!(b.allied(s(op, "a"), s(op, "b"))),
|
||||
"dump" => self.dump(b, probes),
|
||||
other => panic!("op {other}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
fn score_json(sc: &sb::Score) -> Value {
|
||||
json!({
|
||||
"value": sc.value, "locked": sc.locked, "display": comp_json(sc.display.as_ref()),
|
||||
"format": fmt_json(sc.number_format.as_ref()),
|
||||
})
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let registries: Value =
|
||||
serde_json::from_str(&fs::read_to_string(&args[1]).expect("registries")).expect("json");
|
||||
let list = |k: &str| -> Vec<String> {
|
||||
registries[k]
|
||||
.as_array()
|
||||
.map(|a| {
|
||||
a.iter()
|
||||
.filter_map(|v| v.as_str().map(str::to_owned))
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default()
|
||||
};
|
||||
let reg = Registries {
|
||||
items: list("items"),
|
||||
blocks: list("blocks")
|
||||
.into_iter()
|
||||
.map(|b| (b, Vec::new()))
|
||||
.collect(),
|
||||
entity_types: list("entity_types"),
|
||||
..Registries::default()
|
||||
};
|
||||
let fixture = Fixture { reg };
|
||||
let vanilla: BTreeMap<i64, String> = args
|
||||
.get(4)
|
||||
.and_then(|p| fs::read_to_string(p).ok())
|
||||
.map(|text| {
|
||||
text.lines()
|
||||
.filter_map(|l| serde_json::from_str::<Value>(l).ok())
|
||||
.filter_map(|v| Some((v["case"].as_i64()?, v["nbt"].as_str()?.to_owned())))
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
let mut out = std::io::BufWriter::new(fs::File::create(&args[3]).expect("output"));
|
||||
for line in fs::read_to_string(&args[2]).expect("inputs").lines() {
|
||||
let case: Value = serde_json::from_str(line).expect("case");
|
||||
let probes = case["probes"].as_array().cloned().unwrap_or_default();
|
||||
let mut board = Scoreboard::default();
|
||||
let outs: Vec<Value> = case["ops"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|op| fixture.apply(&mut board, op, &probes))
|
||||
.collect();
|
||||
let packed = board.pack();
|
||||
let bytes = encode(&packed);
|
||||
let reloaded = Scoreboard::unpack(&decode(&bytes));
|
||||
let mut result = json!({
|
||||
"case": case["case"], "out": outs, "pack": canon(&packed), "nbt": hex(&bytes),
|
||||
"reload": canon(&reloaded.pack()), "reload_dump": fixture.dump(&reloaded, &probes),
|
||||
});
|
||||
if let Some(v) = case["case"].as_i64().and_then(|c| vanilla.get(&c)) {
|
||||
result["vreload"] = canon(&Scoreboard::unpack(&decode(&unhex(v))).pack());
|
||||
}
|
||||
writeln!(out, "{result}").expect("write");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
//! Loom and crafter screen drawing for tools/test_screen_layout_parity.py:
|
||||
//! reads one JSON case per line and prints the `horizon_client::screen_layout`
|
||||
//! calls in the format of `VanillaLoomScreenOracle`.
|
||||
//!
|
||||
//! usage: screen_layout_fixture RESOURCES INPUT OUTPUT
|
||||
use horizon_client::{
|
||||
banner::{BannerLayer, Banners, banner_color},
|
||||
screen_layout::{self, CrafterView, LoomView, ScreenDraw},
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fs, path::Path, sync::Arc};
|
||||
|
||||
fn draw_json(d: &ScreenDraw) -> Value {
|
||||
let round = |v: f32| ((v * 1e6).round() / 1e6) as f64;
|
||||
match d {
|
||||
ScreenDraw::Gradient { x1, y1 } => json!({"t": "gradient", "x1": x1, "y1": y1}),
|
||||
ScreenDraw::Blit {
|
||||
texture,
|
||||
x,
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
tw,
|
||||
th,
|
||||
} => {
|
||||
json!({"t": "blit", "texture": texture, "x": x, "y": y, "w": w, "h": h, "u": 0.0, "v": 0.0, "tw": tw, "th": th})
|
||||
}
|
||||
ScreenDraw::Sprite { id, x, y, w, h } => {
|
||||
json!({"t": "sprite", "id": id, "x": x, "y": y, "w": w, "h": h})
|
||||
}
|
||||
ScreenDraw::Banner {
|
||||
base,
|
||||
layers,
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
y1,
|
||||
} => {
|
||||
let layers: Vec<Value> = layers
|
||||
.iter()
|
||||
.map(|l| json!([&*l.pattern, &*l.color]))
|
||||
.collect();
|
||||
json!({"t": "banner", "base": base, "layers": layers, "x0": x0, "y0": y0, "x1": x1, "y1": y1})
|
||||
}
|
||||
ScreenDraw::Tooltip { key } => json!({"t": "tooltip", "key": key}),
|
||||
ScreenDraw::SpriteOf { id } => {
|
||||
json!({"t": "sprite_of", "id": id.trim_start_matches("minecraft:")})
|
||||
}
|
||||
ScreenDraw::Fill {
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
y1,
|
||||
color,
|
||||
} => json!({"t": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1, "color": color}),
|
||||
ScreenDraw::Atlas { x0, y0, x1, y1, uv } => json!({
|
||||
"t": "atlas", "x0": x0, "y0": y0, "x1": x1, "y1": y1,
|
||||
"u0": round(uv[0]), "u1": round(uv[1]), "v0": round(uv[2]), "v1": round(uv[3])
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let usage = "usage: screen_layout_fixture RESOURCES INPUT OUTPUT";
|
||||
let banners = Banners::load(Path::new(args.get(1).ok_or(usage)?));
|
||||
let input = fs::read_to_string(args.get(2).ok_or(usage)?)?;
|
||||
let mut out = String::new();
|
||||
for line in input.lines().filter(|l| !l.trim().is_empty()) {
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let int = |k: &str| c[k].as_i64().unwrap_or(0) as i32;
|
||||
let draws = if c["screen"] == "loom" {
|
||||
let patterns: Vec<Arc<str>> = c["patterns"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(|p| p.as_str().map(Arc::from))
|
||||
.collect();
|
||||
let layers: Vec<BannerLayer> = c["resultLayers"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|l| BannerLayer::new(l[0].as_str().unwrap_or(""), l[1].as_str().unwrap_or("")))
|
||||
.collect();
|
||||
let base = c["result"]
|
||||
.as_str()
|
||||
.and_then(banner_color)
|
||||
.unwrap_or("white");
|
||||
let dye = c["dyeStack"]
|
||||
.as_str()
|
||||
.and_then(|d| d.strip_prefix("minecraft:")?.strip_suffix("_dye"))
|
||||
.unwrap_or("white");
|
||||
let view = LoomView {
|
||||
width: int("width"),
|
||||
height: int("height"),
|
||||
left: int("left"),
|
||||
top: int("top"),
|
||||
has_banner: c["banner"].is_string(),
|
||||
has_dye: c["dye"].is_string(),
|
||||
has_pattern: c["pattern"].is_string(),
|
||||
patterns: &patterns,
|
||||
selected: int("selected"),
|
||||
display: c["display"].as_bool().unwrap_or(false),
|
||||
has_max: c["hasMax"].as_bool().unwrap_or(false),
|
||||
scroll: c["scroll"].as_f64().unwrap_or(0.0) as f32,
|
||||
start_row: int("startRow") as usize,
|
||||
result: c.get("resultLayers").map(|_| (base, layers.as_slice())),
|
||||
dye,
|
||||
mouse: (int("mouseX") as f32, int("mouseY") as f32),
|
||||
};
|
||||
screen_layout::loom(&view, &banners)
|
||||
} else {
|
||||
let mut disabled = [false; 9];
|
||||
for (i, d) in c["disabled"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.enumerate()
|
||||
.take(9)
|
||||
{
|
||||
disabled[i] = d.as_bool().unwrap_or(false);
|
||||
}
|
||||
screen_layout::crafter(&CrafterView {
|
||||
width: int("width"),
|
||||
height: int("height"),
|
||||
left: int("left"),
|
||||
top: int("top"),
|
||||
disabled,
|
||||
powered: c["powered"].as_bool().unwrap_or(false),
|
||||
})
|
||||
};
|
||||
let list: Vec<Value> = draws.iter().map(draw_json).collect();
|
||||
out += &json!({ "draws": list }).to_string();
|
||||
out.push('\n');
|
||||
}
|
||||
fs::write(args.get(3).ok_or(usage)?, out)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,367 @@
|
||||
//! The Rust side of tools/test_server_files_parity.py: reads each case
|
||||
//! directory the way VanillaServerFilesOracle does (server.properties,
|
||||
//! eula.txt, the four user lists and scripted list changes) and prints the
|
||||
//! same report. `server_files_probe CASES OUTPUT`.
|
||||
use horizon_client::server::{
|
||||
eula,
|
||||
java_properties::now_millis,
|
||||
properties::{DIFFICULTIES, GAME_MODES, ServerProperties, SystemEntropy},
|
||||
user_lists::{BanEntry, BanList, IpBanList, NameAndId, OpEntry, OpList, WhiteEntry, WhiteList},
|
||||
};
|
||||
use horizon_protocol::crypto::uuid_string;
|
||||
use std::{fmt::Write as _, path::Path};
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let mut args = std::env::args().skip(1);
|
||||
let root = std::path::PathBuf::from(args.next().ok_or("CASES OUTPUT")?);
|
||||
let output = args.next().ok_or("OUTPUT")?;
|
||||
let mut cases: Vec<_> = std::fs::read_dir(&root)?
|
||||
.filter_map(|e| e.ok().map(|e| e.path()))
|
||||
.filter(|p| p.is_dir())
|
||||
.collect();
|
||||
cases.sort();
|
||||
let mut out = String::new();
|
||||
for dir in cases {
|
||||
writeln!(out, "== {}", dir.file_name().unwrap().to_string_lossy())?;
|
||||
run_case(&dir, &mut out)?;
|
||||
}
|
||||
std::fs::write(output, out)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Files.readAllLines: split on \n, \r or \r\n.
|
||||
fn lines(text: &str) -> Vec<String> {
|
||||
let mut v: Vec<String> = text
|
||||
.replace("\r\n", "\n")
|
||||
.replace('\r', "\n")
|
||||
.split('\n')
|
||||
.map(str::to_owned)
|
||||
.collect();
|
||||
if v.last().is_some_and(String::is_empty) {
|
||||
v.pop();
|
||||
}
|
||||
v
|
||||
}
|
||||
fn latin1(bytes: &[u8]) -> String {
|
||||
bytes.iter().map(|&b| char::from(b)).collect()
|
||||
}
|
||||
fn has_key(text: &str, key: &str) -> bool {
|
||||
text.split('\n')
|
||||
.any(|l| l.trim_matches(|c: char| c <= ' ').starts_with(key))
|
||||
}
|
||||
|
||||
fn work(dir: &Path) -> std::io::Result<std::path::PathBuf> {
|
||||
let w = std::env::temp_dir().join(format!(
|
||||
"server-files-{}-{}",
|
||||
std::process::id(),
|
||||
dir.file_name().unwrap().to_string_lossy()
|
||||
));
|
||||
let _ = std::fs::remove_dir_all(&w);
|
||||
std::fs::create_dir_all(&w)?;
|
||||
for e in std::fs::read_dir(dir)? {
|
||||
let e = e?;
|
||||
std::fs::copy(e.path(), w.join(e.file_name()))?;
|
||||
}
|
||||
Ok(w)
|
||||
}
|
||||
|
||||
fn run_case(dir: &Path, out: &mut String) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let w = work(dir)?;
|
||||
let props = w.join("server.properties");
|
||||
if dir.join("server.properties").exists() || dir.join("properties.default").exists() {
|
||||
let before = std::fs::read(&props)
|
||||
.map(|b| latin1(&b))
|
||||
.unwrap_or_default();
|
||||
match ServerProperties::from_file(&props, &mut SystemEntropy::default()) {
|
||||
Ok(p) => {
|
||||
print_properties(&p, &before, out)?;
|
||||
p.store(&props)?;
|
||||
writeln!(out, "stored:")?;
|
||||
for (i, line) in lines(&std::fs::read_to_string(&props)?)
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
{
|
||||
let line = if i == 1 && line.starts_with('#') {
|
||||
"#DATE".to_owned()
|
||||
} else if line.starts_with("management-server-secret=")
|
||||
&& !has_key(&before, "management-server-secret")
|
||||
{
|
||||
"management-server-secret=<random>".to_owned()
|
||||
} else {
|
||||
line
|
||||
};
|
||||
writeln!(out, "{line}")?;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
let class = e.split(':').next().unwrap_or("");
|
||||
writeln!(out, "ERROR {class}")?;
|
||||
}
|
||||
}
|
||||
}
|
||||
if dir.join("eula.txt").exists() || dir.join("eula.missing").exists() {
|
||||
let path = w.join("eula.txt");
|
||||
let agreed = eula::agreed(&path).unwrap_or(false);
|
||||
writeln!(out, "eula agreed={agreed}")?;
|
||||
if let Ok(bytes) = std::fs::read(&path) {
|
||||
for (i, line) in lines(&latin1(&bytes)).into_iter().enumerate() {
|
||||
if i == 1 && line.starts_with('#') {
|
||||
writeln!(out, "#DATE")?;
|
||||
} else {
|
||||
writeln!(out, "{line}")?;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut ops = OpList::new(w.join("ops.json"));
|
||||
let mut white = WhiteList::new(w.join("whitelist.json"));
|
||||
let mut bans = BanList::new(w.join("banned-players.json"));
|
||||
let mut ips = IpBanList::new(w.join("banned-ips.json"));
|
||||
let mut any = false;
|
||||
macro_rules! load {
|
||||
($list:expr, $name:literal) => {
|
||||
if $list.file.exists() {
|
||||
any = true;
|
||||
if let Err(_) = $list.load() {
|
||||
writeln!(
|
||||
out,
|
||||
"{} load ERROR com.google.gson.JsonSyntaxException",
|
||||
$name
|
||||
)?;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
load!(ops, "ops");
|
||||
load!(white, "whitelist");
|
||||
load!(bans, "banned-players");
|
||||
load!(ips, "banned-ips");
|
||||
if let Ok(actions) = std::fs::read_to_string(dir.join("actions.txt")) {
|
||||
any = true;
|
||||
for line in actions.lines().filter(|l| !l.trim().is_empty()) {
|
||||
let a: Vec<&str> = line.split('\t').collect();
|
||||
let user = |n: &str, u: &str| NameAndId {
|
||||
id: horizon_client::server::properties::parse_uuid(u).unwrap(),
|
||||
name: n.to_owned(),
|
||||
};
|
||||
fn ban<T>(
|
||||
user: T,
|
||||
created: &str,
|
||||
source: &str,
|
||||
expires: &str,
|
||||
reason: &str,
|
||||
) -> BanEntry<T> {
|
||||
let date = |s: &str| (s != "-").then(|| s.parse::<i64>().unwrap());
|
||||
BanEntry {
|
||||
user,
|
||||
created: date(created).unwrap_or_else(now_millis),
|
||||
source: if source != "-" {
|
||||
source.to_owned()
|
||||
} else {
|
||||
"(Unknown)".into()
|
||||
},
|
||||
expires: date(expires),
|
||||
reason: (reason != "-").then(|| reason.to_owned()),
|
||||
}
|
||||
}
|
||||
let r = match a[0] {
|
||||
"op" => ops.add(OpEntry {
|
||||
user: user(a[1], a[2]),
|
||||
level: a[3].parse::<i32>()?.clamp(0, 4),
|
||||
bypasses_player_limit: a[4].eq_ignore_ascii_case("true"),
|
||||
}),
|
||||
"deop" => ops.remove(&user(a[1], a[2])),
|
||||
"white" => white.add(WhiteEntry {
|
||||
user: user(a[1], a[2]),
|
||||
}),
|
||||
"unwhite" => white.remove(&user(a[1], a[2])),
|
||||
"ban" => bans.add(ban(user(a[1], a[2]), a[3], a[4], a[5], a[6])),
|
||||
"pardon" => bans.remove(&user(a[1], a[2])),
|
||||
"banip" => ips.add(ban(a[1].to_owned(), a[2], a[3], a[4], a[5])),
|
||||
"pardonip" => ips.remove(&a[1].to_owned()),
|
||||
"isbanned" => bans.contains(&user(a[1], a[2])),
|
||||
"isop" => ops.get(&user(a[1], a[2])).is_some(),
|
||||
other => return Err(format!("unknown action {other}").into()),
|
||||
};
|
||||
writeln!(out, "action {} {r}", a[0])?;
|
||||
}
|
||||
}
|
||||
if any {
|
||||
for (name, json) in [
|
||||
("ops", ops.to_json()),
|
||||
("whitelist", white.to_json()),
|
||||
("banned-players", bans.to_json()),
|
||||
("banned-ips", ips.to_json()),
|
||||
] {
|
||||
writeln!(out, "{name}:\n{json}")?;
|
||||
}
|
||||
let mut names: Vec<String> = ops.entries().iter().map(|e| e.user.name.clone()).collect();
|
||||
names.sort_by(|a, b| a.encode_utf16().cmp(b.encode_utf16()));
|
||||
writeln!(out, "op users {}", names.join(","))?;
|
||||
let mut names: Vec<String> = white
|
||||
.entries()
|
||||
.iter()
|
||||
.map(|e| e.user.name.clone())
|
||||
.collect();
|
||||
names.sort_by(|a, b| a.encode_utf16().cmp(b.encode_utf16()));
|
||||
writeln!(out, "white users {}", names.join(","))?;
|
||||
}
|
||||
let _ = std::fs::remove_dir_all(&w);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn print_properties(p: &ServerProperties, before: &str, out: &mut String) -> std::fmt::Result {
|
||||
let secret = if has_key(before, "management-server-secret") {
|
||||
p.management_server_secret.clone()
|
||||
} else {
|
||||
"<random>".into()
|
||||
};
|
||||
let pack = p.resource_pack.as_ref().map_or_else(
|
||||
|| "none".to_owned(),
|
||||
|i| {
|
||||
format!(
|
||||
"{} {} {} {} {}",
|
||||
uuid_string(i.id),
|
||||
i.url,
|
||||
i.hash,
|
||||
i.required,
|
||||
i.prompt.is_some()
|
||||
)
|
||||
},
|
||||
);
|
||||
let opt_bool = |b: Option<bool>| b.map_or_else(|| "null".to_owned(), |b| b.to_string());
|
||||
let rows: Vec<(&str, String)> = vec![
|
||||
("online-mode", p.online_mode.to_string()),
|
||||
(
|
||||
"prevent-proxy-connections",
|
||||
p.prevent_proxy_connections.to_string(),
|
||||
),
|
||||
("server-ip", p.server_ip.clone()),
|
||||
("allow-flight", p.allow_flight.to_string()),
|
||||
("motd", p.motd.clone()),
|
||||
("enable-code-of-conduct", p.code_of_conduct.to_string()),
|
||||
("bug-report-link", p.bug_report_link.clone()),
|
||||
("force-gamemode", p.force_game_mode.to_string()),
|
||||
("enforce-whitelist", p.enforce_whitelist.to_string()),
|
||||
("difficulty", DIFFICULTIES[p.difficulty as usize].to_owned()),
|
||||
("gamemode", GAME_MODES[p.game_mode as usize].to_owned()),
|
||||
("level-name", p.level_name.clone()),
|
||||
("server-port", p.server_port.to_string()),
|
||||
(
|
||||
"management-server-enabled",
|
||||
p.management_server_enabled.to_string(),
|
||||
),
|
||||
("management-server-host", p.management_server_host.clone()),
|
||||
(
|
||||
"management-server-port",
|
||||
p.management_server_port.to_string(),
|
||||
),
|
||||
("management-server-secret", secret),
|
||||
(
|
||||
"management-server-tls-enabled",
|
||||
p.management_server_tls_enabled.to_string(),
|
||||
),
|
||||
(
|
||||
"management-server-tls-keystore",
|
||||
p.management_server_tls_keystore.clone(),
|
||||
),
|
||||
(
|
||||
"management-server-tls-keystore-password",
|
||||
p.management_server_tls_keystore_password.clone(),
|
||||
),
|
||||
(
|
||||
"management-server-allowed-origins",
|
||||
p.management_server_allowed_origins.clone(),
|
||||
),
|
||||
(
|
||||
"announce-player-achievements",
|
||||
opt_bool(p.announce_player_achievements),
|
||||
),
|
||||
("enable-query", p.enable_query.to_string()),
|
||||
("query.port", p.query_port.to_string()),
|
||||
("enable-rcon", p.enable_rcon.to_string()),
|
||||
("rcon.port", p.rcon_port.to_string()),
|
||||
("rcon.password", p.rcon_password.clone()),
|
||||
("hardcore", p.hardcore.to_string()),
|
||||
("use-native-transport", p.use_native_transport.to_string()),
|
||||
("spawn-protection", p.spawn_protection.to_string()),
|
||||
("op-permission-level", p.op_permission_level.to_string()),
|
||||
(
|
||||
"function-permission-level",
|
||||
p.function_permission_level.to_string(),
|
||||
),
|
||||
("max-tick-time", p.max_tick_time.to_string()),
|
||||
(
|
||||
"max-chained-neighbor-updates",
|
||||
p.max_chained_neighbor_updates.to_string(),
|
||||
),
|
||||
("rate-limit", p.rate_limit.to_string()),
|
||||
(
|
||||
"command-spam-threshold-seconds",
|
||||
p.command_spam_threshold_seconds.to_string(),
|
||||
),
|
||||
(
|
||||
"chat-spam-threshold-seconds",
|
||||
p.chat_spam_threshold_seconds.to_string(),
|
||||
),
|
||||
("view-distance", p.view_distance.to_string()),
|
||||
("simulation-distance", p.simulation_distance.to_string()),
|
||||
("max-players", p.max_players.to_string()),
|
||||
(
|
||||
"network-compression-threshold",
|
||||
p.network_compression_threshold.to_string(),
|
||||
),
|
||||
("broadcast-rcon-to-ops", p.broadcast_rcon_to_ops.to_string()),
|
||||
(
|
||||
"broadcast-console-to-ops",
|
||||
p.broadcast_console_to_ops.to_string(),
|
||||
),
|
||||
("max-world-size", p.max_world_size.to_string()),
|
||||
("sync-chunk-writes", p.sync_chunk_writes.to_string()),
|
||||
("region-file-compression", p.region_file_compression.clone()),
|
||||
("enable-jmx-monitoring", p.enable_jmx_monitoring.to_string()),
|
||||
("enable-status", p.enable_status.to_string()),
|
||||
("hide-online-players", p.hide_online_players.to_string()),
|
||||
(
|
||||
"entity-broadcast-range-percentage",
|
||||
p.entity_broadcast_range_percentage.to_string(),
|
||||
),
|
||||
("text-filtering-config", p.text_filtering_config.clone()),
|
||||
(
|
||||
"text-filtering-version",
|
||||
p.text_filtering_version.to_string(),
|
||||
),
|
||||
("player-idle-timeout", p.player_idle_timeout.to_string()),
|
||||
(
|
||||
"status-heartbeat-interval",
|
||||
p.status_heartbeat_interval.to_string(),
|
||||
),
|
||||
("white-list", p.white_list.to_string()),
|
||||
(
|
||||
"enforce-secure-profile",
|
||||
p.enforce_secure_profile.to_string(),
|
||||
),
|
||||
("log-ips", p.log_ips.to_string()),
|
||||
(
|
||||
"pause-when-empty-seconds",
|
||||
p.pause_when_empty_seconds.to_string(),
|
||||
),
|
||||
("accepts-transfers", p.accepts_transfers.to_string()),
|
||||
(
|
||||
"seed",
|
||||
if p.random_seed {
|
||||
"<random>".into()
|
||||
} else {
|
||||
p.seed.to_string()
|
||||
},
|
||||
),
|
||||
("generate-structures", p.generate_structures.to_string()),
|
||||
("resource-pack", pack),
|
||||
("initial-enabled-packs", p.initial_enabled_packs.join("|")),
|
||||
("initial-disabled-packs", p.initial_disabled_packs.join("|")),
|
||||
];
|
||||
for (k, v) in rows {
|
||||
writeln!(out, "{k}={v}")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
//! Headless transport for the skin half of the player list parity gate:
|
||||
//! decodes each base64 PNG and runs `horizon_client::skins::process_legacy_skin`,
|
||||
//! writing the RGBA result in base64, or "refused".
|
||||
#![forbid(unsafe_code)]
|
||||
use std::{
|
||||
fs,
|
||||
io::{BufWriter, Write},
|
||||
path::PathBuf,
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [inputs, output] = args.as_slice() else {
|
||||
return Err("usage: skin_image_fixture INPUTS OUTPUT".into());
|
||||
};
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let png = horizon_client::skins::base64_decode(line).ok_or("bad base64")?;
|
||||
let result = horizon_client::hud::decode_bytes(&png)
|
||||
.ok()
|
||||
.and_then(|(w, h, rgba)| horizon_client::skins::process_legacy_skin(w, h, &rgba));
|
||||
match result {
|
||||
Some(rgba) => writeln!(out, "{}", horizon_client::lan::base64(&rgba))?,
|
||||
None => writeln!(out, "refused")?,
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
//! The subtitle overlay for differential tests against vanilla's
|
||||
//! `SubtitleOverlay` (tools/test_subtitle_parity.py): replays each case's
|
||||
//! sound plays, clock changes and frames through
|
||||
//! `horizon_client::subtitles` and prints every frame's fills and texts with
|
||||
//! their pose, in VanillaSubtitleOracle's JSON lines.
|
||||
//!
|
||||
//! usage: subtitle_fixture RESOURCES INPUTS OUTPUT
|
||||
use horizon_client::{
|
||||
hud::HudAtlas,
|
||||
hud_layout::{GuiDraw, IDENTITY, background_color, pose_apply},
|
||||
hud_overlays::{SubtitleFrame, SubtitleOverlay},
|
||||
lang,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fs, io::Write, path::PathBuf};
|
||||
|
||||
fn vec3(v: &Value) -> [f64; 3] {
|
||||
std::array::from_fn(|i| v[i].as_f64().unwrap_or(0.0))
|
||||
}
|
||||
fn pose(m: [f32; 6]) -> Value {
|
||||
json!(m)
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [root, inputs, output] = args.as_slice() else {
|
||||
return Err("usage: subtitle_fixture RESOURCES INPUTS OUTPUT".into());
|
||||
};
|
||||
lang::set(lang::Language::load(&[root], lang::DEFAULT));
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
let mut out = std::io::BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let mut overlay = SubtitleOverlay::default();
|
||||
let mut now = 0i64;
|
||||
let mut frames = Vec::new();
|
||||
for op in c["ops"].as_array().into_iter().flatten() {
|
||||
match op["op"].as_str().unwrap_or_default() {
|
||||
// Util.getMillis: nanoseconds / 1_000_000.
|
||||
"time" => now = op["ms"].as_i64().unwrap_or(0),
|
||||
"play" => {
|
||||
if overlay.listening() {
|
||||
let range = op["range"].as_f64().map_or(f32::INFINITY, |r| r as f32);
|
||||
overlay.on_play(
|
||||
op["key"].as_str(),
|
||||
vec3(&op["at"]),
|
||||
range,
|
||||
op["looping"].as_bool().unwrap_or(false),
|
||||
now,
|
||||
);
|
||||
}
|
||||
}
|
||||
"frame" => {
|
||||
let frame = SubtitleFrame {
|
||||
show: op["show"].as_bool().unwrap_or(false),
|
||||
position: vec3(&op["pos"]),
|
||||
forward: vec3(&op["forward"]),
|
||||
up: vec3(&op["up"]),
|
||||
multiplier: op["mult"].as_f64().unwrap_or(1.0),
|
||||
background: background_color(
|
||||
op["chat_only"].as_bool().unwrap_or(true),
|
||||
op["opacity"].as_f64().unwrap_or(0.5),
|
||||
0.8,
|
||||
),
|
||||
width: op["w"].as_i64().unwrap_or(0) as i32,
|
||||
height: op["h"].as_i64().unwrap_or(0) as i32,
|
||||
};
|
||||
let mut stack = vec![IDENTITY];
|
||||
let mut draws = Vec::new();
|
||||
let calls = overlay.extract(&frame, &atlas.font, now);
|
||||
if !calls.is_empty() {
|
||||
draws.push(json!({"type": "stratum"}));
|
||||
}
|
||||
for d in calls {
|
||||
let m = *stack.last().unwrap_or(&IDENTITY);
|
||||
match d {
|
||||
GuiDraw::Push(ops) => {
|
||||
let mut top = m;
|
||||
for op in ops {
|
||||
pose_apply(&mut top, op);
|
||||
}
|
||||
stack.push(top);
|
||||
}
|
||||
GuiDraw::Pop => {
|
||||
stack.pop();
|
||||
}
|
||||
GuiDraw::Fill {
|
||||
x0,
|
||||
y0,
|
||||
x1,
|
||||
y1,
|
||||
color,
|
||||
} => draws.push(json!({
|
||||
"type": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1,
|
||||
"color": format!("{color:x}"), "pose": pose(m),
|
||||
})),
|
||||
GuiDraw::Text {
|
||||
text,
|
||||
x,
|
||||
y,
|
||||
color,
|
||||
shadow,
|
||||
} => draws.push(json!({
|
||||
"type": "text", "text": text.plain(), "x": x, "y": y,
|
||||
"color": format!("{color:x}"), "shadow": shadow, "pose": pose(m),
|
||||
})),
|
||||
other => return Err(format!("unexpected draw {other:?}").into()),
|
||||
}
|
||||
}
|
||||
frames.push(Value::Array(draws));
|
||||
}
|
||||
other => return Err(format!("op {other}").into()),
|
||||
}
|
||||
}
|
||||
writeln!(out, "{}", json!({"case": c["case"], "frames": frames}))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
//! Headless transport for the player list parity gate: builds each case's
|
||||
//! scoreboard (teams, `list` objective, scores), listed players, header and
|
||||
//! footer, replays its frames through `horizon_client::tab_list` and writes
|
||||
//! the draw calls in vanilla's GuiGraphicsExtractor terms (text as styled
|
||||
//! runs, faces as skin blits), each face's skin chosen by
|
||||
//! `horizon_client::skins` from the profile's `textures` property.
|
||||
#![forbid(unsafe_code)]
|
||||
use horizon_client::{
|
||||
component,
|
||||
hud::HudAtlas,
|
||||
hud_layout::GuiDraw,
|
||||
lang,
|
||||
scoreboard::{NumberFormat, RenderType, Scoreboard},
|
||||
skins,
|
||||
tab_list::{self, TabInputs, TabList, TabPlayer},
|
||||
text::Text,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{
|
||||
fs,
|
||||
io::{BufWriter, Write},
|
||||
path::PathBuf,
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
fn text(v: &Value) -> Option<Text> {
|
||||
(!v.is_null()).then(|| component::to_text(v, &mut |_| Text::empty()))
|
||||
}
|
||||
fn format(v: &Value) -> Option<NumberFormat> {
|
||||
match v["type"].as_str()? {
|
||||
"blank" => Some(NumberFormat::Blank),
|
||||
"styled" => Some(NumberFormat::Styled(v["style"].clone())),
|
||||
"fixed" => Some(NumberFormat::Fixed(v["value"].clone())),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
fn runs(t: &Text) -> Value {
|
||||
let mut out: Vec<(String, Value)> = Vec::new();
|
||||
for (c, s) in t.chars() {
|
||||
let key = json!([
|
||||
s.color.map_or(-1, i64::from),
|
||||
s.is_bold(),
|
||||
s.is_italic(),
|
||||
s.underlined == Some(true),
|
||||
s.strikethrough == Some(true),
|
||||
s.obfuscated == Some(true)
|
||||
]);
|
||||
match out.last_mut() {
|
||||
Some((run, k)) if *k == key => run.push(c),
|
||||
_ => out.push((c.to_string(), key)),
|
||||
}
|
||||
}
|
||||
out.into_iter().map(|(r, k)| json!([r, k])).collect()
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<PathBuf> = std::env::args_os().skip(1).map(PathBuf::from).collect();
|
||||
let [root, inputs, output] = args.as_slice() else {
|
||||
return Err("usage: tab_list_fixture RESOURCES INPUTS OUTPUT".into());
|
||||
};
|
||||
let atlas = HudAtlas::build(root)?;
|
||||
lang::set(lang::Language::load(&[root], "en_us"));
|
||||
let font = &atlas.font;
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let mut board = Scoreboard::default();
|
||||
for t in c["teams"].as_array().into_iter().flatten() {
|
||||
let name = t["name"].as_str().unwrap_or("");
|
||||
let team = board.add_team(name);
|
||||
team.color = t["color"].as_str().map(str::to_owned);
|
||||
team.prefix = t["prefix"].clone();
|
||||
team.suffix = t["suffix"].clone();
|
||||
for m in t["members"].as_array().into_iter().flatten() {
|
||||
board.add_to_team(m.as_str().unwrap_or(""), name);
|
||||
}
|
||||
}
|
||||
let objective_name = c["objective"]["name"].as_str().map(str::to_owned);
|
||||
if let Some(name) = &objective_name {
|
||||
let hearts = c["objective"]["renderType"] == "hearts";
|
||||
board.add_objective(
|
||||
name,
|
||||
"dummy",
|
||||
Value::String("x".into()),
|
||||
if hearts {
|
||||
RenderType::Hearts
|
||||
} else {
|
||||
RenderType::Integer
|
||||
},
|
||||
false,
|
||||
format(&c["objective"]["numberFormat"]),
|
||||
);
|
||||
}
|
||||
let uris: Vec<&str> = c["validUris"]
|
||||
.as_array()
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.filter_map(Value::as_str)
|
||||
.collect();
|
||||
let mut players = Vec::new();
|
||||
let mut upside = Vec::new();
|
||||
for p in c["players"].as_array().into_iter().flatten() {
|
||||
let uuid =
|
||||
u128::from_str_radix(&p["uuid"].as_str().unwrap_or("0").replace('-', ""), 16)?;
|
||||
let name = p["name"].as_str().unwrap_or("").to_owned();
|
||||
if p["inLevel"].as_bool().unwrap_or(false) && (name == "Dinnerbone" || name == "Grumm")
|
||||
{
|
||||
upside.push(uuid);
|
||||
}
|
||||
let mut player = TabPlayer::new(uuid, name);
|
||||
player.game_mode = p["gameMode"].as_i64().unwrap_or(0) as i32;
|
||||
player.latency = p["latency"].as_i64().unwrap_or(0) as i32;
|
||||
player.display_name = (!p["displayName"].is_null()).then(|| p["displayName"].clone());
|
||||
player.list_order = p["listOrder"].as_i64().unwrap_or(0) as i32;
|
||||
player.show_hat = p["showHat"].as_bool().unwrap_or(true);
|
||||
if let Some(t) = p.get("textures").filter(|t| !t.is_null()) {
|
||||
let signature = match t["signature"].as_str() {
|
||||
None => skins::Signature::Unsigned,
|
||||
Some("valid") => skins::Signature::Signed,
|
||||
Some(_) => skins::Signature::Invalid,
|
||||
};
|
||||
let textures = skins::unpack(t["value"].as_str().unwrap_or(""), signature, &uris);
|
||||
let local = c["local"].as_str() == p["uuid"].as_str();
|
||||
let download = |_, url: &str| {
|
||||
let hash = skins::texture_hash(url).unwrap_or_default();
|
||||
match c["downloads"][&hash].as_str() {
|
||||
Some("pending") => skins::Download::Pending,
|
||||
Some("fail") => skins::Download::Failed,
|
||||
_ => skins::Download::Ready,
|
||||
}
|
||||
};
|
||||
if let Some(skin) = skins::lookup(&textures, !local, download) {
|
||||
player.skin = skin;
|
||||
}
|
||||
}
|
||||
players.push(player);
|
||||
}
|
||||
let mut list = TabList::default();
|
||||
list.header = text(&c["header"]);
|
||||
list.footer = text(&c["footer"]);
|
||||
let background = tab_list::row_background(
|
||||
c["backgroundForChatOnly"].as_bool().unwrap_or(true),
|
||||
c["opacity"].as_f64().unwrap_or(0.5),
|
||||
);
|
||||
let mut frames = Vec::new();
|
||||
for f in c["frames"].as_array().into_iter().flatten() {
|
||||
if let Some(obj) = &objective_name {
|
||||
for (holder, v) in f["scores"].as_object().into_iter().flatten() {
|
||||
let s = board.score_mut(holder, obj);
|
||||
s.value = v["value"].as_i64().unwrap_or(0) as i32;
|
||||
s.number_format = format(&v["format"]);
|
||||
}
|
||||
for r in f["reset"].as_array().into_iter().flatten() {
|
||||
board.reset_one(r.as_str().unwrap_or(""), obj);
|
||||
}
|
||||
}
|
||||
let visible = f["visible"].as_bool().unwrap_or(false);
|
||||
list.set_visible(visible);
|
||||
let mut draws = Vec::new();
|
||||
if visible {
|
||||
let up = |id: u128| upside.contains(&id);
|
||||
let inputs = TabInputs {
|
||||
players: &players,
|
||||
board: &board,
|
||||
objective: objective_name.as_deref().and_then(|n| board.objective(n)),
|
||||
screen_width: c["width"].as_i64().unwrap_or(0) as i32,
|
||||
online_mode: c["onlineMode"].as_bool().unwrap_or(false),
|
||||
gui_ticks: f["tick"].as_i64().unwrap_or(0),
|
||||
background,
|
||||
upside_down: &up,
|
||||
};
|
||||
for d in list.layout(&inputs, font) {
|
||||
draws.push(match d {
|
||||
GuiDraw::Fill { x0, y0, x1, y1, color } => {
|
||||
json!({"type": "fill", "x0": x0, "y0": y0, "x1": x1, "y1": y1, "color": color as i32})
|
||||
}
|
||||
GuiDraw::Sprite { sprite, x, y, w, h, .. } => {
|
||||
json!({"type": "sprite", "sprite": sprite, "x": x, "y": y, "w": w, "h": h})
|
||||
}
|
||||
GuiDraw::Text { text, x, y, color, shadow } => json!({
|
||||
"type": "text", "runs": runs(&text), "x": x, "y": y, "color": color as i32, "shadow": shadow
|
||||
}),
|
||||
GuiDraw::Blit { texture, x, y, w, h, uv, src, tex, color, .. } => {
|
||||
let a = [x as f64, y as f64, f64::from(uv[0]), f64::from(uv[1]), w as f64, h as f64,
|
||||
src[0] as f64, src[1] as f64, tex[0] as f64, tex[1] as f64];
|
||||
json!({"type": "blit", "texture": texture, "args": a, "color": color as i32})
|
||||
}
|
||||
other => json!({"type": "unexpected", "draw": format!("{other:?}")}),
|
||||
});
|
||||
}
|
||||
}
|
||||
frames.push(Value::Array(draws));
|
||||
}
|
||||
writeln!(out, "{}", json!({ "frames": frames }))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
//! Team rules in gameplay for differential tests against vanilla
|
||||
//! (tools/test_team_rules_parity.py): friendly fire, alliances, collision
|
||||
//! rules, seeing invisible team mates and name tag visibility, from
|
||||
//! `horizon_client::scoreboard`, in VanillaTeamRulesOracle's JSON lines.
|
||||
//!
|
||||
//! usage: team_rules_fixture INPUTS OUTPUT
|
||||
use horizon_client::scoreboard::{self as sb, CollisionRule, NameView, Scoreboard, Visibility};
|
||||
use serde_json::{Value, json};
|
||||
use std::{fs, io::Write};
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let mut out = std::io::BufWriter::new(fs::File::create(&args[2]).expect("output"));
|
||||
for line in fs::read_to_string(&args[1]).expect("inputs").lines() {
|
||||
let c: Value = serde_json::from_str(line).expect("case");
|
||||
let mut board = Scoreboard::default();
|
||||
for name in ["A", "B"] {
|
||||
let o = &c[name];
|
||||
let t = board.add_team(name);
|
||||
t.allow_friendly_fire = o["ff"].as_bool().unwrap_or(true);
|
||||
t.see_friendly_invisibles = o["si"].as_bool().unwrap_or(true);
|
||||
t.collision_rule =
|
||||
CollisionRule::by_name(o["collision"].as_str().unwrap_or("")).expect("rule");
|
||||
t.nametag_visibility =
|
||||
Visibility::by_name(o["nametag"].as_str().unwrap_or("")).expect("visibility");
|
||||
}
|
||||
let team = |k: &str| c[k].as_str().and_then(|n| board.team(n));
|
||||
let flag = |k: &str| c[k].as_bool().unwrap_or(false);
|
||||
let (own, other, viewer) = (team("own"), team("other"), team("viewer"));
|
||||
let invisible =
|
||||
sb::invisible_to(other, viewer, flag("viewer_spectator"), flag("invisible"));
|
||||
let view = NameView {
|
||||
discrete: flag("discrete"),
|
||||
distance_sqr: c["distance"].as_f64().unwrap_or(0.0),
|
||||
invisible_to_viewer: invisible,
|
||||
hud_hidden: flag("hud_hidden"),
|
||||
is_camera: flag("camera_is_entity"),
|
||||
is_vehicle: flag("vehicle"),
|
||||
};
|
||||
let r = json!({
|
||||
"case": c["case"],
|
||||
"damage": sb::teams_allow_damage(own, other),
|
||||
"allied": sb::teams_allied(own, other),
|
||||
"pushes": !flag("spectator") && sb::pushable_by(own, other, flag("pushable")),
|
||||
"invisible": invisible,
|
||||
"name": sb::name_shown(other, viewer, view),
|
||||
});
|
||||
writeln!(out, "{r}").expect("write");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
//! Headless transport for the world border parity gate: replays each case's
|
||||
//! border changes, ticks and frames through `horizon_client::worldborder`,
|
||||
//! `border_render` and `hud_overlays::vignette`, and writes what the
|
||||
//! vanilla renderer computes (bounds, fade, wall buffer, transforms, walls
|
||||
//! drawn, vignette colour) with floats as raw bits.
|
||||
#![forbid(unsafe_code)]
|
||||
use horizon_client::{
|
||||
border_render::{self, BorderRenderState, BorderRenderer},
|
||||
hud_layout::GuiDraw,
|
||||
hud_overlays,
|
||||
worldborder::{BorderStatus, WorldBorder},
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use std::{
|
||||
fs,
|
||||
io::{BufWriter, Write},
|
||||
};
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
fn floats(v: &[f32]) -> Value {
|
||||
v.iter().map(|f| f.to_bits() as i32).collect()
|
||||
}
|
||||
fn doubles(v: &[f64]) -> Value {
|
||||
v.iter().map(|f| f.to_bits() as i64).collect()
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<String> = std::env::args().skip(1).collect();
|
||||
let [inputs, output] = args.as_slice() else {
|
||||
return Err("usage: world_border_render_fixture INPUTS OUTPUT".into());
|
||||
};
|
||||
let mut out = BufWriter::new(fs::File::create(output)?);
|
||||
for line in fs::read_to_string(inputs)?
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
{
|
||||
let c: Value = serde_json::from_str(line)?;
|
||||
let f = |v: &Value| v.as_f64().unwrap_or(0.0);
|
||||
let mut border = WorldBorder::default();
|
||||
border.warning_distance = c["warningBlocks"].as_i64().unwrap_or(0) as i32;
|
||||
border.warning_time = c["warningTime"].as_i64().unwrap_or(0) as i32;
|
||||
border.set_absolute_max_size(c["absoluteMaxSize"].as_i64().unwrap_or(0) as i32);
|
||||
border.set_center([f(&c["centerX"]), f(&c["centerZ"])]);
|
||||
border.set_size(f(&c["size"]));
|
||||
let mut renderer = BorderRenderer::default();
|
||||
let mut state = BorderRenderState::default();
|
||||
let mut frames = Vec::new();
|
||||
for op in c["ops"].as_array().into_iter().flatten() {
|
||||
match op["op"].as_str().unwrap_or("") {
|
||||
"tick" => (0..op["n"].as_i64().unwrap_or(0)).for_each(|_| border.tick()),
|
||||
"lerp" => border.lerp_between(
|
||||
f(&op["from"]),
|
||||
f(&op["to"]),
|
||||
op["ticks"].as_i64().unwrap_or(0),
|
||||
),
|
||||
"size" => border.set_size(f(&op["size"])),
|
||||
"center" => border.set_center([f(&op["x"]), f(&op["z"])]),
|
||||
"warning" => {
|
||||
border.warning_distance = op["blocks"].as_i64().unwrap_or(0) as i32;
|
||||
border.warning_time = op["time"].as_i64().unwrap_or(0) as i32;
|
||||
}
|
||||
"invalidate" => renderer.invalidate(),
|
||||
"frame" => {
|
||||
let partial = f(&op["partial"]) as f32;
|
||||
let p = &op["camera"];
|
||||
let camera = [f(&p[0]), f(&p[1]), f(&p[2])];
|
||||
let distance = f(&op["renderDistance"]);
|
||||
let millis = op["millis"].as_i64().unwrap_or(0);
|
||||
let status = match border.status() {
|
||||
BorderStatus::Growing => "GROWING",
|
||||
BorderStatus::Shrinking => "SHRINKING",
|
||||
BorderStatus::Stationary => "STATIONARY",
|
||||
};
|
||||
let mut frame = json!({
|
||||
"bounds": doubles(&border.bounds_at(partial)),
|
||||
"sizes": doubles(&[border.size(), border.target_size(), border.lerp_speed(), border.distance(camera[0], camera[2])]),
|
||||
"lerpTime": border.remaining_ticks(),
|
||||
"status": status,
|
||||
});
|
||||
border_render::extract(&border, partial, camera, distance, &mut state);
|
||||
frame["alpha"] = doubles(&[state.alpha]);
|
||||
frame["tint"] = json!(state.tint as i32);
|
||||
let drawn =
|
||||
renderer.prepare(&state, camera, distance, f(&op["depthFar"]) as f32);
|
||||
frame["drawn"] = json!(drawn);
|
||||
frame["rebuilt"] = json!(renderer.take_rebuilt());
|
||||
if drawn {
|
||||
frame["vertices"] = floats(&renderer.vertices.concat());
|
||||
let t = renderer.transforms(&state, camera, millis);
|
||||
frame["color"] = floats(&t.color);
|
||||
frame["offset"] = floats(&t.model_offset);
|
||||
frame["texture"] = floats(&[t.texture_offset, t.texture_offset]);
|
||||
frame["sides"] = json!(BorderRenderer::sides(&state, camera, distance));
|
||||
}
|
||||
let warning = border.warning_strength(camera[0], camera[2]);
|
||||
let vignette =
|
||||
hud_overlays::vignette(427, 240, f(&op["vignette"]) as f32, warning);
|
||||
let color = match vignette {
|
||||
GuiDraw::Blit { color, .. } => color,
|
||||
_ => 0,
|
||||
};
|
||||
frame["vignetteColor"] = json!(color as i32);
|
||||
frames.push(frame);
|
||||
}
|
||||
other => return Err(format!("unknown op {other}").into()),
|
||||
}
|
||||
}
|
||||
writeln!(out, "{}", json!({ "frames": frames }))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
//! The player's attack strength (`Player.attackStrengthTicker`,
|
||||
//! `itemSwapTicker`, `getAttackStrengthScale`, `getCurrentItemAttackStrengthDelay`):
|
||||
//! the charge the attack indicator shows and attacks scale their damage by.
|
||||
|
||||
/// `Attributes.ATTACK_SPEED` base value.
|
||||
pub const BASE_ATTACK_SPEED: f64 = 4.0;
|
||||
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct AttackStrength {
|
||||
/// `LivingEntity.attackStrengthTicker`.
|
||||
pub ticker: i32,
|
||||
/// `LivingEntity.itemSwapTicker`.
|
||||
pub swap_ticker: i32,
|
||||
/// `Player.lastItemInMainHand`: the stack as last compared.
|
||||
last_item: Option<HeldStack>,
|
||||
}
|
||||
/// What `ItemStack.matches` / `isSameItem` compare of the main-hand stack:
|
||||
/// its item id and the rest of the stack (count and components) as a key.
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct HeldStack {
|
||||
pub item: String,
|
||||
pub rest: String,
|
||||
}
|
||||
/// `Player.getCurrentItemAttackStrengthDelay` for an ATTACK_SPEED value.
|
||||
pub fn delay(attack_speed: f64) -> f32 {
|
||||
(1.0 / attack_speed * 20.0) as f32
|
||||
}
|
||||
impl AttackStrength {
|
||||
/// The attack-strength part of `Player.tick`: both tickers advance, and a
|
||||
/// main-hand change to a different item resets them
|
||||
/// (`!ItemStack.matches` and `!ItemStack.isSameItem`).
|
||||
pub fn tick(&mut self, main_hand: Option<HeldStack>) {
|
||||
self.ticker += 1;
|
||||
self.swap_ticker += 1;
|
||||
if self.last_item != main_hand {
|
||||
let same_item = match (&self.last_item, &main_hand) {
|
||||
(Some(a), Some(b)) => a.item == b.item,
|
||||
(None, None) => true,
|
||||
_ => false,
|
||||
};
|
||||
if !same_item {
|
||||
self.reset();
|
||||
}
|
||||
self.last_item = main_hand;
|
||||
}
|
||||
}
|
||||
/// `resetAttackStrengthTicker`: swinging at nothing, attacking or
|
||||
/// stopping a block break.
|
||||
pub fn reset(&mut self) {
|
||||
self.ticker = 0;
|
||||
self.swap_ticker = 0;
|
||||
}
|
||||
/// `resetOnlyAttackStrengthTicker` (`Player.onAttack`).
|
||||
pub fn reset_attack(&mut self) {
|
||||
self.ticker = 0;
|
||||
}
|
||||
/// `getAttackStrengthScale(a)` with the ATTACK_SPEED attribute value.
|
||||
pub fn scale(&self, a: f32, attack_speed: f64) -> f32 {
|
||||
((self.ticker as f32 + a) / delay(attack_speed)).clamp(0.0, 1.0)
|
||||
}
|
||||
/// `getItemSwapScale(a)`.
|
||||
pub fn swap_scale(&self, a: f32, attack_speed: f64) -> f32 {
|
||||
((self.swap_ticker as f32 + a) / delay(attack_speed)).clamp(0.0, 1.0)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
fn held(item: &str, rest: &str) -> Option<HeldStack> {
|
||||
Some(HeldStack {
|
||||
item: item.into(),
|
||||
rest: rest.into(),
|
||||
})
|
||||
}
|
||||
#[test]
|
||||
fn charges_over_the_attack_delay() {
|
||||
let mut s = AttackStrength::default();
|
||||
// A sword's 1.6 attacks per second: 12.5 ticks to full strength.
|
||||
assert_eq!(delay(1.6), 12.5);
|
||||
for _ in 0..6 {
|
||||
s.tick(None);
|
||||
}
|
||||
assert_eq!(s.scale(0.25, 1.6), 6.25 / 12.5);
|
||||
for _ in 0..10 {
|
||||
s.tick(None);
|
||||
}
|
||||
assert_eq!(s.scale(0.0, 1.6), 1.0);
|
||||
}
|
||||
#[test]
|
||||
fn switching_items_resets_but_restacking_does_not() {
|
||||
let mut s = AttackStrength::default();
|
||||
s.tick(held("minecraft:stone", "64"));
|
||||
assert_eq!(s.ticker, 0, "picking up an item resets");
|
||||
s.tick(held("minecraft:stone", "63"));
|
||||
assert_eq!(
|
||||
s.ticker, 1,
|
||||
"the same item with another count keeps charging"
|
||||
);
|
||||
s.tick(held("minecraft:diamond_sword", ""));
|
||||
assert_eq!((s.ticker, s.swap_ticker), (0, 0));
|
||||
s.tick(held("minecraft:diamond_sword", ""));
|
||||
s.reset_attack();
|
||||
assert_eq!((s.ticker, s.swap_ticker), (0, 1));
|
||||
}
|
||||
}
|
||||
@@ -329,12 +329,26 @@ fn mix(mixer: &mut Mixer, data: &mut [f32], channels: usize, rate: u32) {
|
||||
}
|
||||
impl Audio {
|
||||
pub fn new(root: &Path) -> Self {
|
||||
Self::with_output(root, true)
|
||||
}
|
||||
/// No output device: the dedicated server.
|
||||
pub fn silent(root: &Path) -> Self {
|
||||
Self::with_output(root, false)
|
||||
}
|
||||
fn with_output(root: &Path, output: bool) -> Self {
|
||||
let registry = SoundRegistry::load(root);
|
||||
let mixer = Arc::new(Mutex::new(Mixer::default()));
|
||||
let (stream, live) = match Self::open(mixer.clone()) {
|
||||
let opened = if output {
|
||||
Self::open(mixer.clone())
|
||||
} else {
|
||||
Err("no output on a dedicated server".into())
|
||||
};
|
||||
let (stream, live) = match opened {
|
||||
Ok(v) => (Some(v), true),
|
||||
Err(e) => {
|
||||
eprintln!("Horizon: audio unavailable: {e}");
|
||||
if output {
|
||||
eprintln!("Horizon: audio unavailable: {e}");
|
||||
}
|
||||
(None, false)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
#![forbid(unsafe_code)]
|
||||
use std::{
|
||||
io::{BufRead, BufReader, Write},
|
||||
os::unix::net::UnixStream,
|
||||
path::{Path, PathBuf},
|
||||
process::{Command, ExitCode, Stdio},
|
||||
thread,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
use horizon_client::control::UnixStream;
|
||||
|
||||
const USAGE: &str = "usage: horizon-ctl [--socket PATH] COMMAND [ARGS...]
|
||||
|
||||
Local commands:
|
||||
|
||||
@@ -0,0 +1,968 @@
|
||||
//! Client-ticked block-entity animation state, as vanilla's block entities
|
||||
//! keep it: `ChestLidController` (chests, trapped and copper chests, ender
|
||||
//! chests), `EnchantingTableBlockEntity.bookAnimationTick`,
|
||||
//! `ShulkerBoxBlockEntity` (open count, animation status, progress),
|
||||
//! `BellBlockEntity` (ring ticks, shake direction, resonation),
|
||||
//! `ConduitBlockEntity.clientTick` (tick count, shape check, rotation,
|
||||
//! hunting, nautilus particles), `SkullBlockEntity.animation` (powered dragon
|
||||
//! and piglin heads) and `DecoratedPotBlockEntity` wobbles.
|
||||
//!
|
||||
//! [`BlockEntityAnims`] holds the state per position and turns it into the
|
||||
//! renderer's [`BlockAnim`]. Its tick methods take what the level answers
|
||||
//! (blocks, entities, game time) as closures, so the parity fixture can drive
|
||||
//! them with scripted inputs (`tools/test_block_entity_anim_parity.py`).
|
||||
use crate::block_entity_render::BlockAnim;
|
||||
use horizon_core::{
|
||||
geometry::trig::{self, Mth},
|
||||
random::{LegacyRandom, RandomSource},
|
||||
};
|
||||
use std::collections::HashMap;
|
||||
|
||||
/// `Direction` names by `get3DDataValue`.
|
||||
pub const DIRECTIONS: [&str; 6] = ["down", "up", "north", "south", "west", "east"];
|
||||
|
||||
fn step(direction: u8) -> [i32; 3] {
|
||||
match direction {
|
||||
0 => [0, -1, 0],
|
||||
1 => [0, 1, 0],
|
||||
2 => [0, 0, -1],
|
||||
3 => [0, 0, 1],
|
||||
4 => [-1, 0, 0],
|
||||
_ => [1, 0, 0],
|
||||
}
|
||||
}
|
||||
|
||||
/// `Direction.from3DDataValue`: `BY_3D_DATA[Mth.abs(data % 6)]`.
|
||||
pub fn from_3d_data_value(data: i32) -> u8 {
|
||||
(data % 6).unsigned_abs() as u8
|
||||
}
|
||||
|
||||
/// The 3D data value of a direction name.
|
||||
pub fn direction_index(name: &str) -> Option<u8> {
|
||||
DIRECTIONS.iter().position(|d| *d == name).map(|i| i as u8)
|
||||
}
|
||||
|
||||
/// `ChestLidController`, shared by `ChestBlockEntity` (chests, trapped and
|
||||
/// copper chests) and `EnderChestBlockEntity`.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct ChestLid {
|
||||
pub should_be_open: bool,
|
||||
pub openness: f32,
|
||||
pub o_openness: f32,
|
||||
}
|
||||
|
||||
impl ChestLid {
|
||||
/// `triggerEvent(1, openCount)`: the lid opens while anyone has it open.
|
||||
pub fn trigger_event(&mut self, b0: i32, b1: i32) -> bool {
|
||||
if b0 == 1 {
|
||||
self.should_be_open = b1 > 0;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
/// `tickLid` (the client ticker `lidAnimateTick`).
|
||||
pub fn tick(&mut self) {
|
||||
self.o_openness = self.openness;
|
||||
if !self.should_be_open && self.openness > 0.0 {
|
||||
self.openness = (self.openness - 0.1).max(0.0);
|
||||
} else if self.should_be_open && self.openness < 1.0 {
|
||||
self.openness = (self.openness + 0.1).min(1.0);
|
||||
}
|
||||
}
|
||||
/// `getOpenness(a)`: `Mth.lerp(a, oOpenness, openness)`.
|
||||
pub fn get_openness(&self, a: f32) -> f32 {
|
||||
self.o_openness + a * (self.openness - self.o_openness)
|
||||
}
|
||||
}
|
||||
|
||||
/// `ChestBlock.opennessCombiner`: a double chest opens as far as its more
|
||||
/// open half (`Math.max(first, second)`, first being the `right` half).
|
||||
pub fn combined_openness(first: f32, second: Option<f32>) -> f32 {
|
||||
match second {
|
||||
Some(second) => java_max(first, second),
|
||||
None => first,
|
||||
}
|
||||
}
|
||||
|
||||
/// `Math.max(float, float)`.
|
||||
fn java_max(a: f32, b: f32) -> f32 {
|
||||
if a.is_nan() {
|
||||
a
|
||||
} else if a == 0.0 && b == 0.0 && a.to_bits() != b.to_bits() {
|
||||
0.0
|
||||
} else if a >= b {
|
||||
a
|
||||
} else {
|
||||
b
|
||||
}
|
||||
}
|
||||
|
||||
/// `ChestRenderer.submit` and `ChestModel.setupAnim`: the lid and lock
|
||||
/// `xRot` for a render-state openness.
|
||||
pub fn chest_lid_x_rot(open: f32) -> f32 {
|
||||
let open = 1.0 - open;
|
||||
let open = 1.0 - open * open * open;
|
||||
-(open * std::f32::consts::FRAC_PI_2)
|
||||
}
|
||||
|
||||
/// `EnchantingTableBlockEntity` book fields.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct EnchantingBook {
|
||||
pub time: i32,
|
||||
pub flip: f32,
|
||||
pub o_flip: f32,
|
||||
pub flip_t: f32,
|
||||
pub flip_a: f32,
|
||||
pub open: f32,
|
||||
pub o_open: f32,
|
||||
pub rot: f32,
|
||||
pub o_rot: f32,
|
||||
pub t_rot: f32,
|
||||
}
|
||||
|
||||
/// The `while (a >= PI) a -= 2PI; while (a < -PI) a += 2PI` loops.
|
||||
fn wrap_pi(mut a: f32) -> f32 {
|
||||
use std::f32::consts::PI;
|
||||
while a >= PI {
|
||||
a -= 2.0 * PI;
|
||||
}
|
||||
while a < -PI {
|
||||
a += 2.0 * PI;
|
||||
}
|
||||
a
|
||||
}
|
||||
|
||||
/// `Mth.floor(float)`.
|
||||
fn mth_floor(v: f32) -> i32 {
|
||||
let i = v as i32;
|
||||
if v < i as f32 { i - 1 } else { i }
|
||||
}
|
||||
|
||||
/// `Mth.frac(float)`.
|
||||
pub fn mth_frac(v: f32) -> f32 {
|
||||
v - mth_floor(v) as f32
|
||||
}
|
||||
|
||||
/// `EnchantTableRenderState` (`EnchantTableRenderer.extractRenderState`) and
|
||||
/// the `BookModel.State` its `submit` builds.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct BookRender {
|
||||
pub flip: f32,
|
||||
pub open: f32,
|
||||
pub time: f32,
|
||||
pub y_rot: f32,
|
||||
/// `BookModel.State.forAnimation`: openness, pageFlip1, pageFlip2.
|
||||
pub openness: f32,
|
||||
pub page_flip1: f32,
|
||||
pub page_flip2: f32,
|
||||
}
|
||||
|
||||
impl EnchantingBook {
|
||||
/// `bookAnimationTick`. `players` are the feet positions of the level's
|
||||
/// non-spectator players (`getNearestPlayer(centre, 3.0, false)`);
|
||||
/// `random` is the block entity class's shared static `RANDOM`.
|
||||
pub fn tick(&mut self, pos: [i32; 3], players: &[[f64; 3]], random: &mut impl RandomSource) {
|
||||
self.o_open = self.open;
|
||||
self.o_rot = self.rot;
|
||||
let c = [
|
||||
f64::from(pos[0]) + 0.5,
|
||||
f64::from(pos[1]) + 0.5,
|
||||
f64::from(pos[2]) + 0.5,
|
||||
];
|
||||
let mut best = -1.0;
|
||||
let mut nearest = None;
|
||||
for p in players {
|
||||
let (dx, dy, dz) = (p[0] - c[0], p[1] - c[1], p[2] - c[2]);
|
||||
let dist = dx * dx + dy * dy + dz * dz;
|
||||
if dist < 9.0 && (best == -1.0 || dist < best) {
|
||||
best = dist;
|
||||
nearest = Some(*p);
|
||||
}
|
||||
}
|
||||
if let Some(p) = nearest {
|
||||
let xd = p[0] - c[0];
|
||||
let zd = p[2] - c[2];
|
||||
self.t_rot = trig::atan2(zd, xd) as f32;
|
||||
self.open += 0.1;
|
||||
if self.open < 0.5 || random.next_int_bound(40).unwrap_or(1) == 0 {
|
||||
let old = self.flip_t;
|
||||
loop {
|
||||
let a = random.next_int_bound(4).unwrap_or(0);
|
||||
let b = random.next_int_bound(4).unwrap_or(0);
|
||||
self.flip_t += (a - b) as f32;
|
||||
if old != self.flip_t {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.t_rot += 0.02;
|
||||
self.open -= 0.1;
|
||||
}
|
||||
self.rot = wrap_pi(self.rot);
|
||||
self.t_rot = wrap_pi(self.t_rot);
|
||||
let dir = wrap_pi(self.t_rot - self.rot);
|
||||
self.rot += dir * 0.4;
|
||||
self.open = self.open.clamp(0.0, 1.0);
|
||||
self.time += 1;
|
||||
self.o_flip = self.flip;
|
||||
let diff = ((self.flip_t - self.flip) * 0.4).clamp(-0.2, 0.2);
|
||||
self.flip_a += (diff - self.flip_a) * 0.9;
|
||||
self.flip += self.flip_a;
|
||||
}
|
||||
/// `EnchantTableRenderer.extractRenderState` and the book state of its
|
||||
/// `submit`.
|
||||
pub fn render(&self, a: f32) -> BookRender {
|
||||
let flip = self.o_flip + a * (self.flip - self.o_flip);
|
||||
let open = self.o_open + a * (self.open - self.o_open);
|
||||
let time = self.time as f32 + a;
|
||||
let y_rot = self.o_rot + wrap_pi(self.rot - self.o_rot) * a;
|
||||
let ff1 = mth_frac(flip + 0.25) * 1.6 - 0.3;
|
||||
let ff2 = mth_frac(flip + 0.75) * 1.6 - 0.3;
|
||||
BookRender {
|
||||
flip,
|
||||
open,
|
||||
time,
|
||||
y_rot,
|
||||
openness: ((time * 0.02).msin() * 0.1 + 1.25) * open,
|
||||
page_flip1: ff1.clamp(0.0, 1.0),
|
||||
page_flip2: ff2.clamp(0.0, 1.0),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `ShulkerBoxBlockEntity.AnimationStatus`.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
|
||||
pub enum ShulkerStatus {
|
||||
#[default]
|
||||
Closed,
|
||||
Opening,
|
||||
Opened,
|
||||
Closing,
|
||||
}
|
||||
|
||||
/// `ShulkerBoxBlockEntity` lid state.
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct Shulker {
|
||||
pub open_count: i32,
|
||||
pub status: ShulkerStatus,
|
||||
pub progress: f32,
|
||||
pub progress_old: f32,
|
||||
}
|
||||
|
||||
/// Side effects of one [`Shulker::tick`].
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct ShulkerTick {
|
||||
/// `doNeighborUpdates` calls (shape and neighbour updates around the box).
|
||||
pub neighbor_updates: u32,
|
||||
/// `moveCollidedEntities`: the swept lid box (min x, y, z, max x, y, z);
|
||||
/// entities in it move out along the facing.
|
||||
pub push: Option<[f64; 6]>,
|
||||
}
|
||||
|
||||
/// `Shulker.getProgressDeltaAabb(size, direction, from, to, position)`.
|
||||
pub fn progress_delta_aabb(
|
||||
size: f32,
|
||||
direction: u8,
|
||||
from: f32,
|
||||
to: f32,
|
||||
position: [f64; 3],
|
||||
) -> [f64; 6] {
|
||||
let size_d = f64::from(size);
|
||||
let mut b = [
|
||||
-size_d * 0.5,
|
||||
0.0,
|
||||
-size_d * 0.5,
|
||||
size_d * 0.5,
|
||||
size_d,
|
||||
size_d * 0.5,
|
||||
];
|
||||
let max = f64::from(from.max(to));
|
||||
let min = f64::from(from.min(to));
|
||||
let s = step(direction);
|
||||
for axis in 0..3 {
|
||||
// expandTowards
|
||||
let a = f64::from(s[axis]) * max * size_d;
|
||||
if a < 0.0 {
|
||||
b[axis] += a;
|
||||
} else if a > 0.0 {
|
||||
b[axis + 3] += a;
|
||||
}
|
||||
}
|
||||
for axis in 0..3 {
|
||||
// contract
|
||||
let a = -f64::from(s[axis]) * (1.0 + min) * size_d;
|
||||
if a < 0.0 {
|
||||
b[axis] -= a;
|
||||
} else if a > 0.0 {
|
||||
b[axis + 3] -= a;
|
||||
}
|
||||
}
|
||||
// new AABB keeps min <= max; then move to the position.
|
||||
let mut out = [0.0; 6];
|
||||
for axis in 0..3 {
|
||||
out[axis] = b[axis].min(b[axis + 3]) + position[axis];
|
||||
out[axis + 3] = b[axis].max(b[axis + 3]) + position[axis];
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
impl Shulker {
|
||||
/// `triggerEvent(1, openCount)`.
|
||||
pub fn trigger_event(&mut self, b0: i32, b1: i32) -> bool {
|
||||
if b0 != 1 {
|
||||
return false;
|
||||
}
|
||||
self.open_count = b1;
|
||||
if b1 == 0 {
|
||||
self.status = ShulkerStatus::Closing;
|
||||
}
|
||||
if b1 == 1 {
|
||||
self.status = ShulkerStatus::Opening;
|
||||
}
|
||||
true
|
||||
}
|
||||
/// `startOpen`/`stopOpen` for a non-spectator user: the new open count to
|
||||
/// send as block event 1, and whether this was the first opener (open) or
|
||||
/// the last closer (close), which play the sound and game event.
|
||||
pub fn start_open(&mut self) -> (i32, bool) {
|
||||
if self.open_count < 0 {
|
||||
self.open_count = 0;
|
||||
}
|
||||
self.open_count += 1;
|
||||
(self.open_count, self.open_count == 1)
|
||||
}
|
||||
pub fn stop_open(&mut self) -> (i32, bool) {
|
||||
self.open_count -= 1;
|
||||
(self.open_count, self.open_count <= 0)
|
||||
}
|
||||
/// `updateAnimation` (`ShulkerBoxBlockEntity.tick`); `facing` is the
|
||||
/// block's facing as a 3D data value.
|
||||
pub fn tick(&mut self, pos: [i32; 3], facing: u8) -> ShulkerTick {
|
||||
let mut out = ShulkerTick::default();
|
||||
self.progress_old = self.progress;
|
||||
match self.status {
|
||||
ShulkerStatus::Closed => self.progress = 0.0,
|
||||
ShulkerStatus::Opening => {
|
||||
self.progress += 0.1;
|
||||
if self.progress_old == 0.0 {
|
||||
out.neighbor_updates += 1;
|
||||
}
|
||||
if self.progress >= 1.0 {
|
||||
self.status = ShulkerStatus::Opened;
|
||||
self.progress = 1.0;
|
||||
out.neighbor_updates += 1;
|
||||
}
|
||||
let bottom = [
|
||||
f64::from(pos[0]) + 0.5,
|
||||
f64::from(pos[1]),
|
||||
f64::from(pos[2]) + 0.5,
|
||||
];
|
||||
out.push = Some(progress_delta_aabb(
|
||||
1.0,
|
||||
facing,
|
||||
self.progress_old,
|
||||
self.progress,
|
||||
bottom,
|
||||
));
|
||||
}
|
||||
ShulkerStatus::Opened => self.progress = 1.0,
|
||||
ShulkerStatus::Closing => {
|
||||
self.progress -= 0.1;
|
||||
if self.progress_old == 1.0 {
|
||||
out.neighbor_updates += 1;
|
||||
}
|
||||
if self.progress <= 0.0 {
|
||||
self.status = ShulkerStatus::Closed;
|
||||
self.progress = 0.0;
|
||||
out.neighbor_updates += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
/// `getProgress(a)`: `Mth.lerp(a, progressOld, progress)`.
|
||||
pub fn get_progress(&self, a: f32) -> f32 {
|
||||
self.progress_old + a * (self.progress - self.progress_old)
|
||||
}
|
||||
/// `ShulkerBoxBlock.canOpen`: a closed box only opens when its lid has room
|
||||
/// (`level.noCollision` of the half-block lid box, deflated by 1e-6).
|
||||
pub fn lid_box(pos: [i32; 3], facing: u8) -> [f64; 6] {
|
||||
let bottom = [
|
||||
f64::from(pos[0]) + 0.5,
|
||||
f64::from(pos[1]),
|
||||
f64::from(pos[2]) + 0.5,
|
||||
];
|
||||
let mut b = progress_delta_aabb(1.0, facing, 0.0, 0.5, bottom);
|
||||
for axis in 0..3 {
|
||||
b[axis] += 1.0e-6;
|
||||
b[axis + 3] -= 1.0e-6;
|
||||
}
|
||||
b
|
||||
}
|
||||
}
|
||||
|
||||
/// What the bell's tick asks about an entity it gathered when rung.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct BellEntity {
|
||||
pub position: [f64; 3],
|
||||
/// `isAlive() && !isRemoved()`.
|
||||
pub alive: bool,
|
||||
/// In `EntityTypeTags.RAIDERS`.
|
||||
pub raider: bool,
|
||||
}
|
||||
|
||||
/// `BellBlockEntity`.
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct Bell {
|
||||
pub ticks: i32,
|
||||
pub shaking: bool,
|
||||
/// `clickDirection` as a 3D data value.
|
||||
pub click_direction: Option<u8>,
|
||||
pub last_ring_timestamp: i64,
|
||||
/// `nearbyEntities`: the living entities around the bell when it was last
|
||||
/// gathered, as caller-defined handles.
|
||||
pub nearby: Option<Vec<u64>>,
|
||||
pub resonating: bool,
|
||||
pub resonation_ticks: i32,
|
||||
}
|
||||
|
||||
/// Side effects of one [`Bell::tick`].
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct BellTick {
|
||||
/// Resonation started: `BELL_RESONATE` (played by the server).
|
||||
pub resonate: bool,
|
||||
/// Resonation ended (`ResonationEndAction`): the client's
|
||||
/// `showBellParticles` entity-effect particles (position and colour) and
|
||||
/// the server's `makeRaidersGlow` targets.
|
||||
pub ended: Option<(Vec<([f64; 3], i32)>, Vec<u64>)>,
|
||||
}
|
||||
|
||||
fn closer_to_center_than(pos: [i32; 3], p: [f64; 3], distance: f64) -> bool {
|
||||
let dx = f64::from(pos[0]) + 0.5 - p[0];
|
||||
let dy = f64::from(pos[1]) + 0.5 - p[1];
|
||||
let dz = f64::from(pos[2]) + 0.5 - p[2];
|
||||
dx * dx + dy * dy + dz * dz < distance * distance
|
||||
}
|
||||
|
||||
impl Bell {
|
||||
/// `triggerEvent(1, direction)`. `gather` lists the living entities whose
|
||||
/// position is inside the bell's block box inflated by 48
|
||||
/// (`updateEntities`, refreshed at most every 60 ticks).
|
||||
pub fn trigger_event(
|
||||
&mut self,
|
||||
b0: i32,
|
||||
b1: i32,
|
||||
game_time: i64,
|
||||
gather: impl FnOnce() -> Vec<u64>,
|
||||
) -> bool {
|
||||
if b0 != 1 {
|
||||
return false;
|
||||
}
|
||||
if game_time > self.last_ring_timestamp + 60 || self.nearby.is_none() {
|
||||
self.last_ring_timestamp = game_time;
|
||||
self.nearby = Some(gather());
|
||||
}
|
||||
self.resonation_ticks = 0;
|
||||
self.click_direction = Some(from_3d_data_value(b1));
|
||||
self.ticks = 0;
|
||||
self.shaking = true;
|
||||
true
|
||||
}
|
||||
/// `BellBlockEntity.tick` with the client's resonation end action.
|
||||
pub fn tick(&mut self, pos: [i32; 3], entity: impl Fn(u64) -> Option<BellEntity>) -> BellTick {
|
||||
let mut out = BellTick::default();
|
||||
if self.shaking {
|
||||
self.ticks += 1;
|
||||
}
|
||||
if self.ticks >= 50 {
|
||||
self.shaking = false;
|
||||
self.ticks = 0;
|
||||
}
|
||||
let nearby = self.nearby.clone().unwrap_or_default();
|
||||
let raider_in = |e: &BellEntity, distance: f64| {
|
||||
e.alive && closer_to_center_than(pos, e.position, distance) && e.raider
|
||||
};
|
||||
if self.ticks >= 5
|
||||
&& self.resonation_ticks == 0
|
||||
&& nearby
|
||||
.iter()
|
||||
.filter_map(|&h| entity(h))
|
||||
.any(|e| raider_in(&e, 32.0))
|
||||
{
|
||||
self.resonating = true;
|
||||
out.resonate = true;
|
||||
}
|
||||
if self.resonating {
|
||||
if self.resonation_ticks < 40 {
|
||||
self.resonation_ticks += 1;
|
||||
} else {
|
||||
// showBellParticles / makeRaidersGlow.
|
||||
let mut color = 16_700_985;
|
||||
let views: Vec<(u64, BellEntity)> = nearby
|
||||
.iter()
|
||||
.filter_map(|&h| Some((h, entity(h)?)))
|
||||
.collect();
|
||||
let count = views
|
||||
.iter()
|
||||
.filter(|(_, e)| closer_to_center_than(pos, e.position, 48.0))
|
||||
.count() as i32;
|
||||
let per = ((count - 21) / -2).clamp(3, 15);
|
||||
let mut particles = Vec::new();
|
||||
let mut glow = Vec::new();
|
||||
for (h, e) in &views {
|
||||
if !raider_in(e, 48.0) {
|
||||
continue;
|
||||
}
|
||||
glow.push(*h);
|
||||
let (bx, bz) = (f64::from(pos[0]), f64::from(pos[2]));
|
||||
let dist = ((e.position[0] - bx) * (e.position[0] - bx)
|
||||
+ (e.position[2] - bz) * (e.position[2] - bz))
|
||||
.sqrt();
|
||||
let x3 = bx + f64::from(0.5f32) + 1.0 / dist * (e.position[0] - bx);
|
||||
let z3 = bz + f64::from(0.5f32) + 1.0 / dist * (e.position[2] - bz);
|
||||
for _ in 0..per {
|
||||
color += 5;
|
||||
particles.push(([x3, f64::from(pos[1]) + 0.5, z3], color));
|
||||
}
|
||||
}
|
||||
out.ended = Some((particles, glow));
|
||||
self.resonating = false;
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
/// The conduit's `destroyTarget` as the client sees it.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct ConduitTarget {
|
||||
pub position: [f64; 3],
|
||||
pub eye_y: f64,
|
||||
pub width: f32,
|
||||
pub height: f32,
|
||||
}
|
||||
|
||||
/// `ConduitBlockEntity` (client side).
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub struct Conduit {
|
||||
pub tick_count: i32,
|
||||
pub active_rotation: f32,
|
||||
pub is_active: bool,
|
||||
pub is_hunting: bool,
|
||||
pub effect_blocks: Vec<[i32; 3]>,
|
||||
}
|
||||
|
||||
/// One nautilus particle: position and velocity.
|
||||
pub type Particle = ([f64; 3], [f64; 3]);
|
||||
|
||||
impl Conduit {
|
||||
/// `updateShape`: water all around, then the frame blocks
|
||||
/// (`BlockTags.CONDUIT_EFFECT_BLOCK`) in the three 5x5 rings.
|
||||
fn update_shape(
|
||||
&mut self,
|
||||
pos: [i32; 3],
|
||||
is_water: &impl Fn([i32; 3]) -> bool,
|
||||
is_frame: &impl Fn([i32; 3]) -> bool,
|
||||
) -> bool {
|
||||
self.effect_blocks.clear();
|
||||
for ox in -1..=1 {
|
||||
for oy in -1..=1 {
|
||||
for oz in -1..=1 {
|
||||
if !is_water([pos[0] + ox, pos[1] + oy, pos[2] + oz]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for ox in -2i32..=2 {
|
||||
for oy in -2i32..=2 {
|
||||
for oz in -2i32..=2 {
|
||||
let (ax, ay, az) = (ox.abs(), oy.abs(), oz.abs());
|
||||
if (ax > 1 || ay > 1 || az > 1)
|
||||
&& (ox == 0 && (ay == 2 || az == 2)
|
||||
|| oy == 0 && (ax == 2 || az == 2)
|
||||
|| oz == 0 && (ax == 2 || ay == 2))
|
||||
{
|
||||
let p = [pos[0] + ox, pos[1] + oy, pos[2] + oz];
|
||||
if is_frame(p) {
|
||||
self.effect_blocks.push(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.effect_blocks.len() >= 16
|
||||
}
|
||||
/// `ConduitBlockEntity.clientTick`: returns the nautilus particles of
|
||||
/// `animationTick`, drawn from the client level's random.
|
||||
pub fn client_tick(
|
||||
&mut self,
|
||||
pos: [i32; 3],
|
||||
game_time: i64,
|
||||
is_water: impl Fn([i32; 3]) -> bool,
|
||||
is_frame: impl Fn([i32; 3]) -> bool,
|
||||
target: Option<ConduitTarget>,
|
||||
random: &mut impl RandomSource,
|
||||
) -> Vec<Particle> {
|
||||
self.tick_count += 1;
|
||||
if game_time % 40 == 0 {
|
||||
self.is_active = self.update_shape(pos, &is_water, &is_frame);
|
||||
self.is_hunting = self.effect_blocks.len() >= 42;
|
||||
}
|
||||
let particles = self.animation_tick(pos, target, random);
|
||||
if self.is_active {
|
||||
self.active_rotation += 1.0;
|
||||
}
|
||||
particles
|
||||
}
|
||||
fn animation_tick(
|
||||
&self,
|
||||
pos: [i32; 3],
|
||||
target: Option<ConduitTarget>,
|
||||
random: &mut impl RandomSource,
|
||||
) -> Vec<Particle> {
|
||||
let mut out = Vec::new();
|
||||
let hh = f64::from(((self.tick_count + 35) as f32 * 0.1).msin() / 2.0 + 0.5);
|
||||
let hh = (hh * hh + hh) * f64::from(0.3f32);
|
||||
let end = [
|
||||
f64::from(pos[0]) + 0.5,
|
||||
f64::from(pos[1]) + 1.5 + hh,
|
||||
f64::from(pos[2]) + 0.5,
|
||||
];
|
||||
for p in &self.effect_blocks {
|
||||
if random.next_int_bound(50).unwrap_or(1) == 0 {
|
||||
let dx = -0.5 + random.next_float() + (p[0] - pos[0]) as f32;
|
||||
let dy = -2.0 + random.next_float() + (p[1] - pos[1]) as f32;
|
||||
let dz = -0.5 + random.next_float() + (p[2] - pos[2]) as f32;
|
||||
out.push((end, [f64::from(dx), f64::from(dy), f64::from(dz)]));
|
||||
}
|
||||
}
|
||||
if let Some(t) = target {
|
||||
let randx = (-0.5 + random.next_float()) * (3.0 + t.width);
|
||||
let randy = -1.0 + random.next_float() * t.height;
|
||||
let randz = (-0.5 + random.next_float()) * (3.0 + t.width);
|
||||
out.push((
|
||||
[t.position[0], t.eye_y, t.position[2]],
|
||||
[f64::from(randx), f64::from(randy), f64::from(randz)],
|
||||
));
|
||||
}
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
/// `SkullBlockEntity` animation (client ticker of dragon and piglin heads).
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct Skull {
|
||||
pub animating: bool,
|
||||
pub tick_count: i32,
|
||||
}
|
||||
impl Skull {
|
||||
/// `SkullBlockEntity.animation`.
|
||||
pub fn tick(&mut self, powered: bool) {
|
||||
if powered {
|
||||
self.animating = true;
|
||||
self.tick_count += 1;
|
||||
} else {
|
||||
self.animating = false;
|
||||
}
|
||||
}
|
||||
/// `getAnimation(a)`.
|
||||
pub fn get_animation(&self, a: f32) -> f32 {
|
||||
if self.animating {
|
||||
self.tick_count as f32 + a
|
||||
} else {
|
||||
self.tick_count as f32
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `DecoratedPotBlockEntity.WobbleStyle`.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum WobbleStyle {
|
||||
Positive,
|
||||
Negative,
|
||||
}
|
||||
impl WobbleStyle {
|
||||
pub fn duration(self) -> i32 {
|
||||
match self {
|
||||
Self::Positive => 7,
|
||||
Self::Negative => 10,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `DecoratedPotBlockEntity` wobble fields.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct PotWobble {
|
||||
pub started_at: i64,
|
||||
pub style: Option<WobbleStyle>,
|
||||
}
|
||||
impl PotWobble {
|
||||
/// `triggerEvent(1, style)`.
|
||||
pub fn trigger_event(&mut self, event: i32, data: i32, game_time: i64) -> bool {
|
||||
if event == 1 && (0..2).contains(&data) {
|
||||
self.started_at = game_time;
|
||||
self.style = Some(if data == 0 {
|
||||
WobbleStyle::Positive
|
||||
} else {
|
||||
WobbleStyle::Negative
|
||||
});
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
/// `DecoratedPotRenderer.extractRenderState`'s `wobbleProgress`.
|
||||
pub fn progress(&self, game_time: i64, partial: f32) -> f32 {
|
||||
match self.style {
|
||||
Some(style) => {
|
||||
((game_time - self.started_at) as f32 + partial) / style.duration() as f32
|
||||
}
|
||||
None => 0.0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `TheEndGatewayBlockEntity` fields the beam reads.
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
|
||||
pub struct EndGateway {
|
||||
pub age: i64,
|
||||
pub teleport_cooldown: i32,
|
||||
}
|
||||
impl EndGateway {
|
||||
/// `beamAnimationTick` (the client ticker).
|
||||
pub fn tick(&mut self) {
|
||||
self.age = self.age.wrapping_add(1);
|
||||
if self.teleport_cooldown > 0 {
|
||||
self.teleport_cooldown -= 1;
|
||||
}
|
||||
}
|
||||
/// `portalTick` on the server copy: whether it called `triggerCooldown`,
|
||||
/// whose block event 1 reaches the client copy.
|
||||
pub fn portal_tick(&mut self) -> bool {
|
||||
let cooling = self.teleport_cooldown > 0;
|
||||
self.age = self.age.wrapping_add(1);
|
||||
if cooling {
|
||||
self.teleport_cooldown -= 1;
|
||||
false
|
||||
} else if self.age % 2400 == 0 {
|
||||
self.teleport_cooldown = 40;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
/// `EndGatewayBlock.entityInside` on the server copy: an entity that can
|
||||
/// use the portal starts the cooldown unless it is already running.
|
||||
pub fn enter(&mut self) -> bool {
|
||||
if self.teleport_cooldown > 0 {
|
||||
return false;
|
||||
}
|
||||
self.teleport_cooldown = 40;
|
||||
true
|
||||
}
|
||||
/// `triggerEvent`: event 1 starts the 40 tick cooldown.
|
||||
pub fn trigger_event(&mut self, event: i32, _data: i32) -> bool {
|
||||
if event == 1 {
|
||||
self.teleport_cooldown = 40;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The client ticker a block entity runs (`getTicker` on a client level),
|
||||
/// or [`Ticker::Pot`] for decorated pots, which keep wobble state unticked.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum Ticker {
|
||||
/// `ChestBlockEntity` / `EnderChestBlockEntity.lidAnimateTick`.
|
||||
Lid,
|
||||
/// `EnchantingTableBlockEntity.bookAnimationTick`.
|
||||
Book,
|
||||
/// `ShulkerBoxBlockEntity.tick`, with the box's facing.
|
||||
Shulker {
|
||||
facing: u8,
|
||||
},
|
||||
/// `BellBlockEntity.clientTick`.
|
||||
Bell,
|
||||
/// `ConduitBlockEntity.clientTick`.
|
||||
Conduit,
|
||||
/// `SkullBlockEntity.animation` (dragon and piglin heads only).
|
||||
Skull {
|
||||
powered: bool,
|
||||
},
|
||||
Pot,
|
||||
/// `TheEndGatewayBlockEntity.beamAnimationTick`.
|
||||
Gateway,
|
||||
}
|
||||
|
||||
/// The [`Ticker`] of a block state, by block name and property lookup.
|
||||
pub fn ticker(name: &str, prop: impl Fn(&str) -> Option<String>) -> Option<Ticker> {
|
||||
let name = name.strip_prefix("minecraft:").unwrap_or(name);
|
||||
let unwaxed = name.strip_prefix("waxed_").unwrap_or(name);
|
||||
Some(match unwaxed {
|
||||
"chest"
|
||||
| "trapped_chest"
|
||||
| "ender_chest"
|
||||
| "copper_chest"
|
||||
| "exposed_copper_chest"
|
||||
| "weathered_copper_chest"
|
||||
| "oxidized_copper_chest" => Ticker::Lid,
|
||||
"enchanting_table" => Ticker::Book,
|
||||
"bell" => Ticker::Bell,
|
||||
"conduit" => Ticker::Conduit,
|
||||
"decorated_pot" => Ticker::Pot,
|
||||
"end_gateway" => Ticker::Gateway,
|
||||
"dragon_head" | "dragon_wall_head" | "piglin_head" | "piglin_wall_head" => Ticker::Skull {
|
||||
powered: prop("powered").as_deref() == Some("true"),
|
||||
},
|
||||
n if n.ends_with("shulker_box") => Ticker::Shulker {
|
||||
facing: prop("facing")
|
||||
.as_deref()
|
||||
.and_then(direction_index)
|
||||
.unwrap_or(1),
|
||||
},
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
/// The animated block entities of a level, by position.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BlockEntityAnims {
|
||||
pub chests: HashMap<[i32; 3], ChestLid>,
|
||||
pub books: HashMap<[i32; 3], EnchantingBook>,
|
||||
/// `EnchantingTableBlockEntity.RANDOM`, shared by every table.
|
||||
pub book_random: LegacyRandom,
|
||||
pub shulkers: HashMap<[i32; 3], Shulker>,
|
||||
pub bells: HashMap<[i32; 3], Bell>,
|
||||
pub conduits: HashMap<[i32; 3], Conduit>,
|
||||
pub skulls: HashMap<[i32; 3], Skull>,
|
||||
pub pots: HashMap<[i32; 3], PotWobble>,
|
||||
pub gateways: HashMap<[i32; 3], EndGateway>,
|
||||
/// The integrated server's copies of the gateways (`portalTick`).
|
||||
pub gateway_servers: HashMap<[i32; 3], EndGateway>,
|
||||
/// The client level's random (conduit particles).
|
||||
pub random: LegacyRandom,
|
||||
/// [`Ticker`] by block state id (see [`BlockEntityAnims::classify`]).
|
||||
pub kinds: Vec<Option<Ticker>>,
|
||||
}
|
||||
impl Default for BlockEntityAnims {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
chests: HashMap::new(),
|
||||
books: HashMap::new(),
|
||||
book_random: LegacyRandom::new(0x626f6f6b),
|
||||
shulkers: HashMap::new(),
|
||||
bells: HashMap::new(),
|
||||
conduits: HashMap::new(),
|
||||
skulls: HashMap::new(),
|
||||
pots: HashMap::new(),
|
||||
gateways: HashMap::new(),
|
||||
gateway_servers: HashMap::new(),
|
||||
random: LegacyRandom::new(0x6c6576656c),
|
||||
kinds: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl BlockEntityAnims {
|
||||
/// Fills [`Self::kinds`] for every state of the registry.
|
||||
pub fn classify(&mut self, registry: &horizon_world::registry::BlockRegistry) {
|
||||
self.kinds = (0..registry.len() as u32)
|
||||
.map(|id| {
|
||||
registry
|
||||
.state(horizon_world::registry::BlockStateId(id))
|
||||
.and_then(|s| ticker(&s.name, |k| s.properties.get(k).cloned()))
|
||||
})
|
||||
.collect();
|
||||
}
|
||||
/// The ticker of a block state.
|
||||
pub fn ticker(&self, state: u32) -> Option<Ticker> {
|
||||
self.kinds.get(state as usize).copied().flatten()
|
||||
}
|
||||
/// Drops the state of block entities that are gone or changed kind:
|
||||
/// `present` maps the loaded block entities to their tickers.
|
||||
pub fn retain_present(&mut self, present: &HashMap<[i32; 3], Ticker>) {
|
||||
let is = |p: &[i32; 3], f: fn(&Ticker) -> bool| present.get(p).is_some_and(f);
|
||||
self.chests.retain(|p, _| is(p, |t| *t == Ticker::Lid));
|
||||
self.books.retain(|p, _| is(p, |t| *t == Ticker::Book));
|
||||
self.shulkers
|
||||
.retain(|p, _| is(p, |t| matches!(t, Ticker::Shulker { .. })));
|
||||
self.bells.retain(|p, _| is(p, |t| *t == Ticker::Bell));
|
||||
self.conduits
|
||||
.retain(|p, _| is(p, |t| *t == Ticker::Conduit));
|
||||
self.skulls
|
||||
.retain(|p, _| is(p, |t| matches!(t, Ticker::Skull { .. })));
|
||||
self.pots.retain(|p, _| is(p, |t| *t == Ticker::Pot));
|
||||
self.gateways
|
||||
.retain(|p, _| is(p, |t| *t == Ticker::Gateway));
|
||||
}
|
||||
/// Drops the state of positions whose block entity is gone.
|
||||
pub fn retain(&mut self, keep: impl Fn([i32; 3]) -> bool) {
|
||||
self.chests.retain(|p, _| keep(*p));
|
||||
self.books.retain(|p, _| keep(*p));
|
||||
self.shulkers.retain(|p, _| keep(*p));
|
||||
self.bells.retain(|p, _| keep(*p));
|
||||
self.conduits.retain(|p, _| keep(*p));
|
||||
self.skulls.retain(|p, _| keep(*p));
|
||||
self.pots.retain(|p, _| keep(*p));
|
||||
self.gateways.retain(|p, _| keep(*p));
|
||||
self.gateway_servers.retain(|p, _| keep(*p));
|
||||
}
|
||||
/// `getOpenNess(partial)` of the chest or ender chest at `pos`.
|
||||
pub fn lid(&self, pos: [i32; 3], partial: f32) -> f32 {
|
||||
self.chests
|
||||
.get(&pos)
|
||||
.map_or(0.0, |l| l.get_openness(partial))
|
||||
}
|
||||
/// The renderer's view of the block entity at `pos`; `sherds` are the
|
||||
/// pot's decorations (back, left, right, front), when it is a pot.
|
||||
pub fn block_anim(
|
||||
&self,
|
||||
pos: [i32; 3],
|
||||
game_time: i64,
|
||||
partial: f32,
|
||||
sherds: [Option<String>; 4],
|
||||
) -> BlockAnim {
|
||||
let mut anim = BlockAnim {
|
||||
sherds,
|
||||
// Gateways not ticked yet render settled (no beam).
|
||||
gateway: self
|
||||
.gateways
|
||||
.get(&pos)
|
||||
.map_or((i64::MAX, 0), |g| (g.age, g.teleport_cooldown)),
|
||||
..BlockAnim::default()
|
||||
};
|
||||
if let Some(b) = self.books.get(&pos) {
|
||||
anim.book = *b;
|
||||
}
|
||||
if let Some(s) = self.shulkers.get(&pos) {
|
||||
anim.shulker = (s.progress, s.progress_old);
|
||||
}
|
||||
if let Some(b) = self.bells.get(&pos) {
|
||||
anim.bell_ticks = b.ticks;
|
||||
anim.bell_shake = b
|
||||
.shaking
|
||||
.then_some(b.click_direction)
|
||||
.flatten()
|
||||
.map(|d| DIRECTIONS[usize::from(d)]);
|
||||
}
|
||||
if let Some(c) = self.conduits.get(&pos) {
|
||||
anim.conduit = (c.tick_count, c.is_active, c.is_hunting, c.active_rotation);
|
||||
}
|
||||
if let Some(s) = self.skulls.get(&pos) {
|
||||
anim.skull = (s.animating, s.tick_count);
|
||||
}
|
||||
if let Some(w) = self.pots.get(&pos)
|
||||
&& w.style.is_some()
|
||||
{
|
||||
// extractRenderState never copies lastWobbleStyle into the render
|
||||
// state, so DecoratedPotRenderer.submit always takes the
|
||||
// non-POSITIVE branch (with the style's own duration).
|
||||
anim.wobble = Some((false, w.progress(game_time, partial)));
|
||||
}
|
||||
anim
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,22 @@
|
||||
//! Block-entity renderers (`BlockEntityRenderers`): chests (single, double,
|
||||
//! trapped, ender, copper), shulker boxes, banners, skulls and heads, bells,
|
||||
//! decorated pots, conduits, enchanting-table and lectern books and copper
|
||||
//! golem statues. Models are vanilla's baked `LayerDefinitions` layers
|
||||
//! golem statues, End portals and End gateways. Models are vanilla's baked `LayerDefinitions` layers
|
||||
//! (`entity-models.json`); transforms, animation and textures follow each
|
||||
//! vanilla renderer. Faces are lit like the `entity` shader: the lightmap at
|
||||
//! the block plus `minecraft_mix_light` with the level's two diffuse lights.
|
||||
use crate::{hud::Rect, mesher::Vertex, world::World};
|
||||
use glam::{DVec3, Mat4, Quat, Vec3};
|
||||
use horizon_core::{
|
||||
geometry::trig::Mth,
|
||||
random::{LegacyRandom, RandomSource},
|
||||
use horizon_core::geometry::{
|
||||
Direction,
|
||||
trig::{self, Mth},
|
||||
};
|
||||
use horizon_world::{
|
||||
block_render::FaceVisibility,
|
||||
registry::{BlockRegistry, BlockStateId},
|
||||
};
|
||||
use horizon_world::registry::{BlockRegistry, BlockStateId};
|
||||
use serde_json::Value;
|
||||
use std::{collections::HashMap, f32::consts::PI, path::Path};
|
||||
use std::{collections::HashMap, f32::consts::PI, path::Path, sync::Mutex};
|
||||
|
||||
/// One baked `ModelPart`: initial pose, textured polygons (pixel units,
|
||||
/// normalized UVs) and named children.
|
||||
@@ -256,6 +259,8 @@ enum SkullType {
|
||||
enum Kind {
|
||||
None,
|
||||
Chest {
|
||||
/// The block (`neighbourState.is(state.getBlock())`).
|
||||
block: String,
|
||||
texture: &'static str,
|
||||
part: ChestPart,
|
||||
y_rot: f32,
|
||||
@@ -289,6 +294,12 @@ enum Kind {
|
||||
pose: &'static str,
|
||||
facing: &'static str,
|
||||
},
|
||||
/// `TheEndPortalRenderer`: the top and bottom faces of a 6/16-tall slab.
|
||||
EndPortal,
|
||||
/// `TheEndGatewayRenderer`: the visible faces of the cube and the beam.
|
||||
EndGateway {
|
||||
state: u32,
|
||||
},
|
||||
/// Sign text (`StandingSignRenderer` / `HangingSignRenderer`); the boards are block models.
|
||||
Sign {
|
||||
hanging: bool,
|
||||
@@ -323,6 +334,7 @@ fn classify(name: &str, prop: &dyn Fn(&str) -> Option<String>) -> Kind {
|
||||
ChestPart::Right => Some(step(opposite(clockwise(facing)))),
|
||||
};
|
||||
Kind::Chest {
|
||||
block: name.to_owned(),
|
||||
texture: match part {
|
||||
ChestPart::Single => texture,
|
||||
ChestPart::Left => left,
|
||||
@@ -413,6 +425,8 @@ fn classify(name: &str, prop: &dyn Fn(&str) -> Option<String>) -> Kind {
|
||||
};
|
||||
}
|
||||
"conduit" => return Kind::Conduit,
|
||||
"end_portal" => return Kind::EndPortal,
|
||||
"end_gateway" => return Kind::EndGateway { state: 0 },
|
||||
"enchanting_table" => return Kind::EnchantingTable,
|
||||
"lectern" => {
|
||||
return if prop("has_book").as_deref() == Some("true") {
|
||||
@@ -512,72 +526,6 @@ fn classify(name: &str, prop: &dyn Fn(&str) -> Option<String>) -> Kind {
|
||||
Kind::None
|
||||
}
|
||||
|
||||
/// `EnchantingTableBlockEntity` book animation state.
|
||||
#[derive(Clone, Copy, Default)]
|
||||
struct Book {
|
||||
time: i32,
|
||||
flip: f32,
|
||||
o_flip: f32,
|
||||
flip_t: f32,
|
||||
flip_a: f32,
|
||||
open: f32,
|
||||
o_open: f32,
|
||||
rot: f32,
|
||||
o_rot: f32,
|
||||
t_rot: f32,
|
||||
}
|
||||
fn wrap(mut a: f32) -> f32 {
|
||||
while a >= PI {
|
||||
a -= 2.0 * PI;
|
||||
}
|
||||
while a < -PI {
|
||||
a += 2.0 * PI;
|
||||
}
|
||||
a
|
||||
}
|
||||
impl Book {
|
||||
/// `EnchantingTableBlockEntity.bookAnimationTick`.
|
||||
fn tick(&mut self, pos: [i32; 3], player: Option<[f64; 3]>, random: &mut LegacyRandom) {
|
||||
self.o_open = self.open;
|
||||
self.o_rot = self.rot;
|
||||
let c = [
|
||||
f64::from(pos[0]) + 0.5,
|
||||
f64::from(pos[1]) + 0.5,
|
||||
f64::from(pos[2]) + 0.5,
|
||||
];
|
||||
let near = player.filter(|p| {
|
||||
(p[0] - c[0]).powi(2) + (p[1] - c[1]).powi(2) + (p[2] - c[2]).powi(2) < 9.0
|
||||
});
|
||||
if let Some(p) = near {
|
||||
self.t_rot = (p[2] - c[2]).atan2(p[0] - c[0]) as f32;
|
||||
self.open += 0.1;
|
||||
if self.open < 0.5 || random.next_int_bound(40).unwrap_or(1) == 0 {
|
||||
let old = self.flip_t;
|
||||
loop {
|
||||
let a = random.next_int_bound(4).unwrap_or(0);
|
||||
let b = random.next_int_bound(4).unwrap_or(0);
|
||||
self.flip_t += (a - b) as f32;
|
||||
if old != self.flip_t {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.t_rot += 0.02;
|
||||
self.open -= 0.1;
|
||||
}
|
||||
self.rot = wrap(self.rot);
|
||||
self.t_rot = wrap(self.t_rot);
|
||||
let dir = wrap(self.t_rot - self.rot);
|
||||
self.rot += dir * 0.4;
|
||||
self.open = self.open.clamp(0.0, 1.0);
|
||||
self.time += 1;
|
||||
self.o_flip = self.flip;
|
||||
let diff = ((self.flip_t - self.flip) * 0.4).clamp(-0.2, 0.2);
|
||||
self.flip_a += (diff - self.flip_a) * 0.9;
|
||||
self.flip += self.flip_a;
|
||||
}
|
||||
}
|
||||
/// `BookModel.setupAnim` for `BookModel.State(openness, pageFlip1, pageFlip2)`.
|
||||
fn book_pose(openness: f32, flip1: f32, flip2: f32) -> impl Fn(&str, &mut [f32; 9]) {
|
||||
move |name, p| match name {
|
||||
@@ -737,6 +685,10 @@ pub struct BlockAnim {
|
||||
pub sherds: [Option<String>; 4],
|
||||
/// `DecoratedPotRenderState` wobble style (positive) and progress.
|
||||
pub wobble: Option<(bool, f32)>,
|
||||
/// `EnchantingTableBlockEntity` book fields.
|
||||
pub book: crate::block_entity_anim::EnchantingBook,
|
||||
/// `TheEndGatewayBlockEntity` age and teleportCooldown.
|
||||
pub gateway: (i64, i32),
|
||||
}
|
||||
|
||||
/// One `submitText` call (`AbstractSignRenderer.submitSignText`).
|
||||
@@ -765,6 +717,8 @@ pub struct Scene<'a> {
|
||||
pub texts: Option<&'a std::cell::RefCell<Vec<TextCall>>>,
|
||||
pub partial: f32,
|
||||
pub game_time: i64,
|
||||
/// `Level.getMaxY` (End gateway beams while spawning).
|
||||
pub max_y: i32,
|
||||
pub world: &'a World,
|
||||
pub sprites: &'a HashMap<String, Rect>,
|
||||
pub nether: bool,
|
||||
@@ -781,10 +735,10 @@ pub struct Scene<'a> {
|
||||
pub struct BlockEntityRenderer {
|
||||
models: HashMap<&'static str, ModelPart>,
|
||||
kinds: Vec<Kind>,
|
||||
books: HashMap<[i32; 3], Book>,
|
||||
random: LegacyRandom,
|
||||
/// Item id to its `PROVIDES_POTTERY_PATTERN` side texture (`Sheets.DECORATED_POT_MAPPER`).
|
||||
pot_patterns: HashMap<String, String>,
|
||||
/// `Block.shouldRenderFace` for End gateway faces (its occlusion pair cache needs a lock).
|
||||
visibility: Option<Mutex<FaceVisibility>>,
|
||||
}
|
||||
const MODELS: [(&str, &str); 27] = [
|
||||
("chest", "minecraft:chest#main"),
|
||||
@@ -835,6 +789,7 @@ impl BlockEntityRenderer {
|
||||
.filter_map(|(key, layer)| all.get(*layer).map(|v| (*key, ModelPart::parse(v))))
|
||||
.collect();
|
||||
let mut renderer = Self::new(models, registry);
|
||||
renderer.visibility = Some(Mutex::new(crate::models::load_visibility(root, registry)?));
|
||||
// Sherd items: provides_pottery_pattern -> decorated_pot_pattern asset id.
|
||||
if let Ok(bytes) = std::fs::read(root.join("items.json")) {
|
||||
let items: Value = serde_json::from_slice(&bytes)?;
|
||||
@@ -864,16 +819,18 @@ impl BlockEntityRenderer {
|
||||
.map(|id| {
|
||||
registry.state(BlockStateId(id)).map_or(Kind::None, |s| {
|
||||
let prop = |k: &str| s.properties.get(k).cloned();
|
||||
classify(&s.name, &prop)
|
||||
match classify(&s.name, &prop) {
|
||||
Kind::EndGateway { .. } => Kind::EndGateway { state: id },
|
||||
kind => kind,
|
||||
}
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
Self {
|
||||
models,
|
||||
kinds,
|
||||
books: HashMap::new(),
|
||||
random: LegacyRandom::new(0x5EED_B00C),
|
||||
pot_patterns: HashMap::new(),
|
||||
visibility: None,
|
||||
}
|
||||
}
|
||||
/// The standing banner's pole-and-bar and flag models (`BannerRenderer.submitSpecial`).
|
||||
@@ -886,24 +843,6 @@ impl BlockEntityRenderer {
|
||||
fn kind(&self, state: u32) -> &Kind {
|
||||
self.kinds.get(state as usize).unwrap_or(&Kind::None)
|
||||
}
|
||||
/// Client-side block-entity ticks (enchanting-table books).
|
||||
pub fn tick<'a>(
|
||||
&mut self,
|
||||
blocks: impl Iterator<Item = &'a ([i32; 3], u32)>,
|
||||
player: Option<[f64; 3]>,
|
||||
) {
|
||||
let mut seen = Vec::new();
|
||||
for (pos, state) in blocks {
|
||||
if matches!(self.kind(*state), Kind::EnchantingTable) {
|
||||
seen.push(*pos);
|
||||
}
|
||||
}
|
||||
self.books.retain(|p, _| seen.contains(p));
|
||||
for pos in seen {
|
||||
let book = self.books.entry(pos).or_default();
|
||||
book.tick(pos, player, &mut self.random);
|
||||
}
|
||||
}
|
||||
pub fn render<'a>(
|
||||
&self,
|
||||
scene: &Scene,
|
||||
@@ -921,7 +860,13 @@ impl BlockEntityRenderer {
|
||||
f64::from(pos[1]) + 0.5,
|
||||
f64::from(pos[2]) + 0.5,
|
||||
);
|
||||
if center.distance_squared(scene.camera) > VIEW_DISTANCE * VIEW_DISTANCE {
|
||||
// BlockEntityRenderer.getViewDistance: 256 for End gateways.
|
||||
let distance = if matches!(kind, Kind::EndGateway { .. }) {
|
||||
256.0
|
||||
} else {
|
||||
VIEW_DISTANCE
|
||||
};
|
||||
if center.distance_squared(scene.camera) > distance * distance {
|
||||
continue;
|
||||
}
|
||||
let origin = (DVec3::new(f64::from(pos[0]), f64::from(pos[1]), f64::from(pos[2]))
|
||||
@@ -951,21 +896,65 @@ impl BlockEntityRenderer {
|
||||
pub fn renders(&self, state: u32) -> bool {
|
||||
!matches!(self.kind(state), Kind::None)
|
||||
}
|
||||
/// Sets an enchanting table's book fields (`EnchantingTableBlockEntity`):
|
||||
/// time, flip, oFlip, open, oOpen, rot, oRot.
|
||||
pub fn set_book(&mut self, pos: [i32; 3], time: i32, fields: [f32; 6]) {
|
||||
let [flip, o_flip, open, o_open, rot, o_rot] = fields;
|
||||
let book = self.books.entry(pos).or_default();
|
||||
*book = Book {
|
||||
time,
|
||||
flip,
|
||||
o_flip,
|
||||
open,
|
||||
o_open,
|
||||
rot,
|
||||
o_rot,
|
||||
..*book
|
||||
/// `ChestRenderer.extractRenderState`'s openness for the chest of `state`
|
||||
/// at `pos`: `ChestBlock.combine` (`DoubleBlockCombiner.combineWithNeigbour`)
|
||||
/// pairs a double half with its neighbour only when that is the same
|
||||
/// block, the other half and faces the same way; `opennessCombiner` then
|
||||
/// takes the more open of both. Also returns the paired half's position.
|
||||
/// `lid` is `getOpenNess(partial)` at a position; non-chests give 0.
|
||||
pub fn chest_openness_of(
|
||||
&self,
|
||||
pos: [i32; 3],
|
||||
state: u32,
|
||||
block_at: &dyn Fn([i32; 3]) -> u32,
|
||||
lid: &dyn Fn([i32; 3]) -> f32,
|
||||
) -> (f32, Option<[i32; 3]>) {
|
||||
self.chest_openness(pos, self.kind(state), block_at, lid)
|
||||
}
|
||||
fn chest_openness(
|
||||
&self,
|
||||
pos: [i32; 3],
|
||||
kind: &Kind,
|
||||
block_at: &dyn Fn([i32; 3]) -> u32,
|
||||
lid: &dyn Fn([i32; 3]) -> f32,
|
||||
) -> (f32, Option<[i32; 3]>) {
|
||||
let Kind::Chest {
|
||||
block,
|
||||
part,
|
||||
y_rot,
|
||||
double_with,
|
||||
..
|
||||
} = kind
|
||||
else {
|
||||
return (0.0, None);
|
||||
};
|
||||
let open = lid(pos);
|
||||
let Some(d) = double_with else {
|
||||
return (open, None);
|
||||
};
|
||||
let other = [pos[0] + d[0], pos[1] + d[1], pos[2] + d[2]];
|
||||
match self.kind(block_at(other)) {
|
||||
Kind::Chest {
|
||||
block: other_block,
|
||||
part: other_part,
|
||||
y_rot: other_y_rot,
|
||||
..
|
||||
} if other_block == block
|
||||
&& *other_part != ChestPart::Single
|
||||
&& other_part != part
|
||||
&& other_y_rot == y_rot =>
|
||||
{
|
||||
let other_open = lid(other);
|
||||
// The right half is the first.
|
||||
let open = if *part == ChestPart::Right {
|
||||
crate::block_entity_anim::combined_openness(open, Some(other_open))
|
||||
} else {
|
||||
crate::block_entity_anim::combined_openness(other_open, Some(open))
|
||||
};
|
||||
(open, Some(other))
|
||||
}
|
||||
_ => (open, None),
|
||||
}
|
||||
}
|
||||
/// One block entity of `state` drawn under `base` (minecart contents).
|
||||
pub fn render_state(
|
||||
@@ -1060,7 +1049,7 @@ impl BlockEntityRenderer {
|
||||
texture,
|
||||
part,
|
||||
y_rot,
|
||||
double_with,
|
||||
..
|
||||
} => {
|
||||
let model = match part {
|
||||
ChestPart::Single => "chest",
|
||||
@@ -1070,22 +1059,24 @@ impl BlockEntityRenderer {
|
||||
let (Some(model), Some(_)) = (self.models.get(model), sprite(texture)) else {
|
||||
return;
|
||||
};
|
||||
// ChestBlock.opennessCombiner / BrightnessCombiner: both halves.
|
||||
let mut open = (scene.lid)(pos);
|
||||
let (open, other) = self.chest_openness(
|
||||
pos,
|
||||
kind,
|
||||
&|p| scene.world.block(p[0], p[1], p[2]).0,
|
||||
scene.lid,
|
||||
);
|
||||
// BrightnessCombiner: the brighter of both halves, per channel.
|
||||
let mut packed = packed;
|
||||
if let Some(d) = double_with {
|
||||
let other = [pos[0] + d[0], pos[1] + d[1], pos[2] + d[2]];
|
||||
open = open.max((scene.lid)(other));
|
||||
if let Some(other) = other {
|
||||
let l = scene.world.light(other[0], other[1], other[2]);
|
||||
packed = (packed >> 4).max(l >> 4) << 4 | (packed & 15).max(l & 15);
|
||||
}
|
||||
let open = 1.0 - (1.0 - open).powi(3);
|
||||
let m = base
|
||||
* around(
|
||||
Mat4::from_rotation_y((-y_rot).to_radians()),
|
||||
Vec3::new(0.5, 0.0, 0.5),
|
||||
);
|
||||
let lid = -(open * PI / 2.0);
|
||||
let lid = crate::block_entity_anim::chest_lid_x_rot(open);
|
||||
let adjust = move |name: &str, p: &mut [f32; 9]| {
|
||||
if name == "lid" || name == "lock" {
|
||||
p[3] = lid;
|
||||
@@ -1291,6 +1282,53 @@ impl BlockEntityRenderer {
|
||||
}
|
||||
}
|
||||
}
|
||||
Kind::EndPortal => {
|
||||
// TheEndPortalRenderer.TRANSFORMATION: y from 6/16 to 12/16; only the
|
||||
// vertical faces (TheEndPortalBlockEntity.shouldRenderFace).
|
||||
let m = base
|
||||
* Mat4::from_translation(Vec3::new(0.0, 0.375, 0.0))
|
||||
* Mat4::from_scale(Vec3::new(1.0, 0.375, 1.0));
|
||||
portal_cube(m, &[Direction::Down, Direction::Up], END_PORTAL_LAYER, out);
|
||||
}
|
||||
Kind::EndGateway { state } => {
|
||||
let anim = (scene.anim)(pos);
|
||||
let b = gateway_beam(anim.gateway, scene.partial, scene.max_y, scene.game_time);
|
||||
if b.height > 0
|
||||
&& let Some(s) = sprite("entity/end_portal/end_gateway_beam")
|
||||
{
|
||||
beam(
|
||||
base,
|
||||
BeamShape {
|
||||
scale: b.scale,
|
||||
time: b.animation_time,
|
||||
start: -b.height,
|
||||
height: b.height * 2,
|
||||
color: b.color,
|
||||
solid_radius: 0.15,
|
||||
glow_radius: 0.175,
|
||||
},
|
||||
s,
|
||||
out,
|
||||
);
|
||||
}
|
||||
// AbstractEndPortalRenderer.extractRenderState: TheEndGatewayBlockEntity.shouldRenderFace.
|
||||
let faces: Vec<Direction> = Direction::ALL
|
||||
.into_iter()
|
||||
.filter(|&d| {
|
||||
let [dx, dy, dz] = d.normal();
|
||||
let neighbor = scene.world.block(pos[0] + dx, pos[1] + dy, pos[2] + dz);
|
||||
self.visibility.as_ref().is_none_or(|v| {
|
||||
v.lock()
|
||||
.map(|mut v| {
|
||||
v.should_render_face(BlockStateId(*state), neighbor, d, true)
|
||||
.unwrap_or(true)
|
||||
})
|
||||
.unwrap_or(true)
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
portal_cube(base, &faces, END_GATEWAY_LAYER, out);
|
||||
}
|
||||
Kind::Conduit => {
|
||||
let (ticks, active, hunting, raw_rotation) = (scene.anim)(pos).conduit;
|
||||
// ConduitRenderer.extractRenderState.
|
||||
@@ -1363,21 +1401,18 @@ impl BlockEntityRenderer {
|
||||
) else {
|
||||
return;
|
||||
};
|
||||
let b = self.books.get(&pos).copied().unwrap_or_default();
|
||||
let a = scene.partial;
|
||||
let flip = b.o_flip + (b.flip - b.o_flip) * a;
|
||||
let open = b.o_open + (b.open - b.o_open) * a;
|
||||
let time = b.time as f32 + a;
|
||||
let y_rot = b.o_rot + wrap(b.rot - b.o_rot) * a;
|
||||
// EnchantTableRenderer.extractRenderState and submit.
|
||||
let b = (scene.anim)(pos).book.render(scene.partial);
|
||||
let m = base
|
||||
* Mat4::from_translation(Vec3::new(0.5, 0.75, 0.5))
|
||||
* Mat4::from_translation(Vec3::new(0.0, 0.1 + (time * 0.1).msin() * 0.01, 0.0))
|
||||
* Mat4::from_rotation_y(-y_rot)
|
||||
* Mat4::from_translation(Vec3::new(
|
||||
0.0,
|
||||
0.1 + (b.time * 0.1).msin() * 0.01,
|
||||
0.0,
|
||||
))
|
||||
* Mat4::from_rotation_y(-b.y_rot)
|
||||
* Mat4::from_rotation_z(80f32.to_radians());
|
||||
let ff1 = (frac(flip + 0.25) * 1.6 - 0.3).clamp(0.0, 1.0);
|
||||
let ff2 = (frac(flip + 0.75) * 1.6 - 0.3).clamp(0.0, 1.0);
|
||||
// BookModel.State.forAnimation.
|
||||
let openness = ((time * 0.02).msin() * 0.1 + 1.25) * open;
|
||||
let (openness, ff1, ff2) = (b.openness, b.page_flip1, b.page_flip2);
|
||||
draw_part(model, "root", m, &book_pose(openness, ff1, ff2), paint, out);
|
||||
}
|
||||
Kind::Lectern { y_rot } => {
|
||||
@@ -1438,8 +1473,7 @@ impl BlockEntityRenderer {
|
||||
/// rotating solid beam and its translucent glow, the last section 2048
|
||||
/// blocks tall. `origin` is the beacon block's corner relative to the camera,
|
||||
/// `time` the animation time (game time mod 40 plus partial tick) and `scale`
|
||||
/// the radius scale. The sprite's v range rides in the light bytes (the
|
||||
/// entity shader wraps v for layer 6).
|
||||
/// the radius scale.
|
||||
pub fn beacon_beam(
|
||||
origin: Vec3,
|
||||
sections: &[(u32, i32)],
|
||||
@@ -1448,9 +1482,7 @@ pub fn beacon_beam(
|
||||
s: Rect,
|
||||
out: &mut Vec<Vertex>,
|
||||
) {
|
||||
let q = |v: f32| (v * 65535.0).round().clamp(0.0, 65535.0) as u32;
|
||||
let wrap = q(s.v0) | q(s.v1 - s.v0) << 16;
|
||||
let o = origin + Vec3::new(0.5, 0.0, 0.5);
|
||||
let base = Mat4::from_translation(origin);
|
||||
let mut start = 0i32;
|
||||
for (i, &(color, height)) in sections.iter().enumerate() {
|
||||
let height = if i == sections.len() - 1 {
|
||||
@@ -1458,63 +1490,177 @@ pub fn beacon_beam(
|
||||
} else {
|
||||
height
|
||||
};
|
||||
let end = start + height;
|
||||
let scroll = if height < 0 { time } else { -time };
|
||||
let v_off = frac(scroll * 0.2 - (scroll * 0.1).floor());
|
||||
let abgr =
|
||||
|a: u32| a << 24 | (color & 255) << 16 | (color >> 8 & 255) << 8 | (color >> 16 & 255);
|
||||
// Solid beam: radius 0.2 * scale, rotated with time.
|
||||
let r = 0.2 * scale;
|
||||
let rot = glam::Mat3::from_rotation_y((time * 2.25 - 45.0).to_radians());
|
||||
let corners = [
|
||||
rot * Vec3::new(0.0, 0.0, r),
|
||||
rot * Vec3::new(r, 0.0, 0.0),
|
||||
rot * Vec3::new(-r, 0.0, 0.0),
|
||||
rot * Vec3::new(0.0, 0.0, -r),
|
||||
];
|
||||
let v2 = -1.0 + v_off;
|
||||
let v1 = height as f32 * (0.5 / r) + v2;
|
||||
beam_part(out, o, start, end, corners, [v1, v2], abgr(255), s, wrap);
|
||||
// Glow: radius 0.25 * scale, translucent.
|
||||
let g = 0.25 * scale;
|
||||
let corners = [
|
||||
Vec3::new(-g, 0.0, -g),
|
||||
Vec3::new(g, 0.0, -g),
|
||||
Vec3::new(-g, 0.0, g),
|
||||
Vec3::new(g, 0.0, g),
|
||||
];
|
||||
let v1 = height as f32 + v2;
|
||||
beam_part(out, o, start, end, corners, [v1, v2], abgr(32), s, wrap);
|
||||
start = end;
|
||||
let shape = BeamShape {
|
||||
scale: 1.0,
|
||||
time,
|
||||
start,
|
||||
height,
|
||||
color,
|
||||
solid_radius: 0.2 * scale,
|
||||
glow_radius: 0.25 * scale,
|
||||
};
|
||||
beam(base, shape, s, out);
|
||||
start += height;
|
||||
}
|
||||
}
|
||||
/// `BeaconRenderer.renderPart`: four quads between the corners (wn, en, ws, es).
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn beam_part(
|
||||
out: &mut Vec<Vertex>,
|
||||
o: Vec3,
|
||||
/// The arguments of `BeaconRenderer.submitBeaconBeam`.
|
||||
pub struct BeamShape {
|
||||
/// Scales the v range (End gateways shrink and grow their beam with it).
|
||||
pub scale: f32,
|
||||
/// Animation time: game time mod 40 plus the partial tick.
|
||||
pub time: f32,
|
||||
pub start: i32,
|
||||
pub height: i32,
|
||||
/// RGB.
|
||||
pub color: u32,
|
||||
pub solid_radius: f32,
|
||||
pub glow_radius: f32,
|
||||
}
|
||||
/// `BeaconRenderer.submitBeaconBeam` under `base` (the block's corner): the
|
||||
/// rotating solid beam and its translucent glow. The sprite's v range rides
|
||||
/// in the light bytes (the entity shader wraps v for layer 6).
|
||||
pub fn beam(base: Mat4, b: BeamShape, s: Rect, out: &mut Vec<Vertex>) {
|
||||
let q = |v: f32| (v * 65535.0).round().clamp(0.0, 65535.0) as u32;
|
||||
let wrap = q(s.v0) | q(s.v1 - s.v0) << 16;
|
||||
let color = b.color;
|
||||
let end = b.start + b.height;
|
||||
let scroll = if b.height < 0 { b.time } else { -b.time };
|
||||
let v_off = frac(scroll * 0.2 - (scroll * 0.1).floor());
|
||||
let abgr =
|
||||
|a: u32| a << 24 | (color & 255) << 16 | (color >> 8 & 255) << 8 | (color >> 16 & 255);
|
||||
// Solid beam, rotated with time.
|
||||
let r = b.solid_radius;
|
||||
let rot = glam::Mat3::from_rotation_y((b.time * 2.25 - 45.0).to_radians());
|
||||
let corners = [
|
||||
rot * Vec3::new(0.0, 0.0, r),
|
||||
rot * Vec3::new(r, 0.0, 0.0),
|
||||
rot * Vec3::new(-r, 0.0, 0.0),
|
||||
rot * Vec3::new(0.0, 0.0, -r),
|
||||
];
|
||||
let v2 = -1.0 + v_off;
|
||||
let v1 = b.height as f32 * b.scale * (0.5 / r) + v2;
|
||||
let part = BeamPart {
|
||||
base,
|
||||
start: b.start,
|
||||
end,
|
||||
s,
|
||||
wrap,
|
||||
};
|
||||
part.emit(out, corners, [v1, v2], abgr(255));
|
||||
// Glow, translucent.
|
||||
let g = b.glow_radius;
|
||||
let corners = [
|
||||
Vec3::new(-g, 0.0, -g),
|
||||
Vec3::new(g, 0.0, -g),
|
||||
Vec3::new(-g, 0.0, g),
|
||||
Vec3::new(g, 0.0, g),
|
||||
];
|
||||
let v1 = b.height as f32 * b.scale + v2;
|
||||
part.emit(out, corners, [v1, v2], abgr(32));
|
||||
}
|
||||
struct BeamPart {
|
||||
base: Mat4,
|
||||
start: i32,
|
||||
end: i32,
|
||||
[wn, en, ws, es]: [Vec3; 4],
|
||||
[v1, v2]: [f32; 2],
|
||||
color: u32,
|
||||
s: Rect,
|
||||
wrap: u32,
|
||||
) {
|
||||
for (a, b) in [(wn, en), (es, ws), (en, es), (ws, wn)] {
|
||||
let at = |c: Vec3, y: i32| o + c + Vec3::new(0.0, y as f32, 0.0);
|
||||
for (p, uv) in [
|
||||
(at(a, end), [s.u1, v1]),
|
||||
(at(a, start), [s.u1, v2]),
|
||||
(at(b, start), [s.u0, v2]),
|
||||
(at(b, end), [s.u0, v1]),
|
||||
] {
|
||||
}
|
||||
impl BeamPart {
|
||||
/// `BeaconRenderer.renderPart`: four quads between the corners (wn, en, ws, es).
|
||||
fn emit(
|
||||
&self,
|
||||
out: &mut Vec<Vertex>,
|
||||
[wn, en, ws, es]: [Vec3; 4],
|
||||
[v1, v2]: [f32; 2],
|
||||
color: u32,
|
||||
) {
|
||||
let s = self.s;
|
||||
for (a, b) in [(wn, en), (es, ws), (en, es), (ws, wn)] {
|
||||
let at = |c: Vec3, y: i32| {
|
||||
self.base
|
||||
.transform_point3(Vec3::new(0.5, 0.0, 0.5) + c + Vec3::new(0.0, y as f32, 0.0))
|
||||
};
|
||||
for (p, uv) in [
|
||||
(at(a, self.end), [s.u1, v1]),
|
||||
(at(a, self.start), [s.u1, v2]),
|
||||
(at(b, self.start), [s.u0, v2]),
|
||||
(at(b, self.end), [s.u0, v1]),
|
||||
] {
|
||||
out.push(Vertex {
|
||||
pos: p.to_array(),
|
||||
uv,
|
||||
layer: 6,
|
||||
color,
|
||||
light: self.wrap,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `EndGatewayRenderState`'s beam fields (zero when there is no beam).
|
||||
#[derive(Clone, Copy, Debug, Default, PartialEq)]
|
||||
pub struct GatewayBeam {
|
||||
pub height: i32,
|
||||
pub scale: f32,
|
||||
pub color: u32,
|
||||
pub animation_time: f32,
|
||||
}
|
||||
|
||||
/// `TheEndGatewayRenderer.extractRenderState` from the block entity's age and
|
||||
/// teleport cooldown, at `partial`, for a level whose top is `max_y`.
|
||||
pub fn gateway_beam(
|
||||
(age, cooldown): (i64, i32),
|
||||
partial: f32,
|
||||
max_y: i32,
|
||||
game_time: i64,
|
||||
) -> GatewayBeam {
|
||||
let spawning = age < 200;
|
||||
if !spawning && cooldown <= 0 {
|
||||
return GatewayBeam::default();
|
||||
}
|
||||
let percent = if spawning {
|
||||
((age as f32 + partial) / 200.0).clamp(0.0, 1.0)
|
||||
} else {
|
||||
1.0 - ((cooldown as f32 - partial) / 40.0).clamp(0.0, 1.0)
|
||||
};
|
||||
let distance = if spawning { f64::from(max_y) } else { 50.0 };
|
||||
let scale = trig::sin(f64::from(percent * PI));
|
||||
GatewayBeam {
|
||||
height: (f64::from(scale) * distance).floor() as i32,
|
||||
scale,
|
||||
// DyeColor.MAGENTA / PURPLE getTextureDiffuseColor.
|
||||
color: if spawning { 0xFFC7_4EBD } else { 0xFF89_32B8 },
|
||||
animation_time: game_time.rem_euclid(40) as f32 + partial,
|
||||
}
|
||||
}
|
||||
|
||||
/// Entity-shader layers for `rendertype_end_portal`: end portals draw 15
|
||||
/// layers of `end_portal.png` over `end_sky.png`, End gateways 16.
|
||||
pub const END_PORTAL_LAYER: u32 = 9;
|
||||
pub const END_GATEWAY_LAYER: u32 = 10;
|
||||
/// `AbstractEndPortalRenderer.FACES`: the unit cube's corners for each face
|
||||
/// (`Direction` order) in `FaceInfo` vertex order.
|
||||
#[rustfmt::skip]
|
||||
const PORTAL_FACES: [[[f32; 3]; 4]; 6] = [
|
||||
[[0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 1.0]],
|
||||
[[0.0, 1.0, 0.0], [0.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 0.0]],
|
||||
[[1.0, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0]],
|
||||
[[0.0, 1.0, 1.0], [0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0]],
|
||||
[[0.0, 1.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.0, 1.0, 1.0]],
|
||||
[[1.0, 1.0, 1.0], [1.0, 0.0, 1.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0]],
|
||||
];
|
||||
/// `AbstractEndPortalRenderer.submitCube`: position-only quads (the portal
|
||||
/// shader projects its textures from the screen; uv, colour and light are unused).
|
||||
fn portal_cube(m: Mat4, faces: &[Direction], layer: u32, out: &mut Vec<Vertex>) {
|
||||
for &d in faces {
|
||||
for c in PORTAL_FACES[d as usize] {
|
||||
out.push(Vertex {
|
||||
pos: p.to_array(),
|
||||
uv,
|
||||
layer: 6,
|
||||
color,
|
||||
light: wrap,
|
||||
pos: m.transform_point3(Vec3::from(c)).to_array(),
|
||||
uv: [0.0; 2],
|
||||
layer,
|
||||
color: 0,
|
||||
light: 0,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Loaded 100 of 538 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user