From aab380a13e9f73a0bf6d3e584f9ca817f2449403 Mon Sep 17 00:00:00 2001 From: suprohub Date: Sat, 1 Nov 2025 18:41:07 +0300 Subject: [PATCH 1/6] Add advanced parkouring --- azalea/src/pathfinder/moves/parkour.rs | 330 ++++++++++--------------- 1 file changed, 124 insertions(+), 206 deletions(-) diff --git a/azalea/src/pathfinder/moves/parkour.rs b/azalea/src/pathfinder/moves/parkour.rs index b4a03732..b65cd676 100644 --- a/azalea/src/pathfinder/moves/parkour.rs +++ b/azalea/src/pathfinder/moves/parkour.rs @@ -1,257 +1,175 @@ use azalea_client::{SprintDirection, WalkDirection}; -use azalea_core::{direction::CardinalDirection, position::BlockPos}; -use tracing::trace; use super::{Edge, ExecuteCtx, IsReachedCtx, MoveData, PathfinderCtx}; use crate::pathfinder::{astar, costs::*, player_pos_to_block_pos, rel_block_pos::RelBlockPos}; pub fn parkour_move(ctx: &mut PathfinderCtx, node: RelBlockPos) { if !ctx.world.is_block_solid(node.down(1)) { - // we can only parkour from solid blocks (not just standable blocks like slabs) return; } - parkour_forward_1_move(ctx, node); - parkour_forward_2_move(ctx, node); - parkour_forward_3_move(ctx, node); -} - -fn parkour_forward_1_move(ctx: &mut PathfinderCtx, pos: RelBlockPos) { - for dir in CardinalDirection::iter() { - let gap_offset = RelBlockPos::new(dir.x(), 0, dir.z()); - let offset = RelBlockPos::new(dir.x() * 2, 0, dir.z() * 2); - - // make sure we actually have to jump - if ctx.world.is_block_solid((pos + gap_offset).down(1)) { - continue; - } - if !ctx.world.is_passable(pos + gap_offset) { - continue; - } + let distance = 5; - let ascend: i32 = if ctx.world.is_standable(pos + offset.up(1)) { - // ascend - 1 - } else if ctx.world.is_standable(pos + offset) { - // forward - 0 - } else { - continue; - }; - - // make sure we have space to jump - if !ctx.world.is_block_passable((pos + gap_offset).up(2)) { - continue; - } + for dx in -distance..=distance { + for dz in -distance..=distance { + if ((-1..=1).contains(&dx) && (-1..=1).contains(&dz)) + || dx * dx + dz * dz > distance * distance + { + continue; + } - // make sure there's not a block above us - if !ctx.world.is_block_passable(pos.up(2)) { - continue; - } - // make sure there's not a block above the target - if !ctx.world.is_block_passable((pos + offset).up(2)) { - continue; + parkour_direction_move(ctx, node, dx, dz, dx.abs().max(dz.abs())); } + } +} - let cost = JUMP_PENALTY + WALK_ONE_BLOCK_COST * 2. + CENTER_AFTER_FALL_COST; +fn parkour_direction_move( + ctx: &mut PathfinderCtx, + pos: RelBlockPos, + dx: i16, + dz: i16, + distance: i16, +) { + let target_offset = RelBlockPos::new(dx, 0, dz); + let target_pos = pos + target_offset; + + if !are_gaps_valid(ctx, pos, dx, dz) + || (!ctx.world.is_block_passable(pos.up(2)) + || !ctx.world.is_block_passable(target_pos.up(2))) + { + return; + } + if let Some((target, cost)) = find_landing_position(ctx, target_pos, distance - 1) { ctx.edges.push(Edge { movement: astar::Movement { - target: pos + offset.up(ascend), + target, data: MoveData { execute: &execute_parkour_move, is_reached: &parkour_is_reached, }, }, cost, - }) + }); } } -fn parkour_forward_2_move(ctx: &mut PathfinderCtx, pos: RelBlockPos) { - 'dir: for dir in CardinalDirection::iter() { - let gap_1_offset = RelBlockPos::new(dir.x(), 0, dir.z()); - let gap_2_offset = RelBlockPos::new(dir.x() * 2, 0, dir.z() * 2); - let offset = RelBlockPos::new(dir.x() * 3, 0, dir.z() * 3); - - // make sure we actually have to jump - if ctx.world.is_block_solid((pos + gap_1_offset).down(1)) - || ctx.world.is_block_solid((pos + gap_2_offset).down(1)) - { - continue; - } - - let mut cost = JUMP_PENALTY + WALK_ONE_BLOCK_COST * 3. + CENTER_AFTER_FALL_COST; - - let ascend: i32 = if ctx.world.is_standable(pos + offset.up(1)) { - 1 - } else if ctx.world.is_standable(pos + offset) { - cost += FALL_N_BLOCKS_COST[1]; - 0 - } else if ctx.world.is_standable(pos + offset.down(1)) { - cost += FALL_N_BLOCKS_COST[2]; - -1 - } else { - continue; - }; +fn are_gaps_valid(ctx: &mut PathfinderCtx, pos: RelBlockPos, dx: i16, dz: i16) -> bool { + let line = get_line_bresenham(0, 0, dx, dz); + + line.iter() + .enumerate() + .skip(1) + .take(line.len().saturating_sub(2)) + .all(|(_, &(x, z))| { + let gap_pos = pos + RelBlockPos::new(x, 0, z); + !ctx.world.is_block_solid(gap_pos.down(1)) + && ctx.world.is_passable(gap_pos) + && ctx.world.is_block_passable(gap_pos.up(2)) + }) +} - // make sure we have space to jump - for offset in [gap_1_offset, gap_2_offset] { - if !ctx.world.is_passable(pos + offset) { - continue 'dir; - } - if !ctx.world.is_block_passable((pos + offset).up(2)) { - continue 'dir; - } +fn get_line_bresenham(x0: i16, y0: i16, x1: i16, y1: i16) -> Vec<(i16, i16)> { + let mut points = Vec::new(); + let (dx, dy) = ((x1 - x0).abs(), (y1 - y0).abs()); + let (sx, sy) = (x0.cmp(&x1).reverse() as i16, y0.cmp(&y1).reverse() as i16); + let mut err = dx - dy; + let (mut x, mut y) = (x0, y0); + + loop { + points.push((x, y)); + if x == x1 && y == y1 { + break; } - // make sure there's not a block above us - if !ctx.world.is_block_passable(pos.up(2)) { - continue; + let e2 = 2 * err; + if e2 > -dy { + err -= dy; + x += sx; } - // make sure there's not a block above the target - if !ctx.world.is_block_passable((pos + offset).up(2)) { - continue; + if e2 < dx { + err += dx; + y += sy; } - - ctx.edges.push(Edge { - movement: astar::Movement { - target: pos + offset.up(ascend), - data: MoveData { - execute: &execute_parkour_move, - is_reached: &parkour_is_reached, - }, - }, - cost, - }) } + points } -fn parkour_forward_3_move(ctx: &mut PathfinderCtx, pos: RelBlockPos) { - 'dir: for dir in CardinalDirection::iter() { - let gap_1_offset = RelBlockPos::new(dir.x(), 0, dir.z()); - let gap_2_offset = RelBlockPos::new(dir.x() * 2, 0, dir.z() * 2); - let gap_3_offset = RelBlockPos::new(dir.x() * 3, 0, dir.z() * 3); - let offset = RelBlockPos::new(dir.x() * 4, 0, dir.z() * 4); - - // make sure we actually have to jump - if ctx.world.is_block_solid((pos + gap_1_offset).down(1)) - || ctx.world.is_block_solid((pos + gap_2_offset).down(1)) - || ctx.world.is_block_solid((pos + gap_3_offset).down(1)) - { - continue; - } - - if !ctx.world.is_standable(pos + offset) { - continue; - }; - - // make sure we have space to jump - for offset in [gap_1_offset, gap_2_offset, gap_3_offset] { - if !ctx.world.is_passable(pos + offset) { - continue 'dir; +fn find_landing_position( + ctx: &mut PathfinderCtx, + base_target: RelBlockPos, + distance: i16, +) -> Option<(RelBlockPos, f32)> { + generate_height_checks(distance) + .into_iter() + .find_map(|(height_offset, fall_cost)| { + let target = base_target.up(height_offset); + if ctx.world.is_standable(target) { + let movement_cost = if distance >= 4 { + SPRINT_ONE_BLOCK_COST + } else { + WALK_ONE_BLOCK_COST + }; + let actual_distance = + ((base_target.x as f32).powi(2) + (base_target.z as f32).powi(2)).sqrt(); + let cost = JUMP_PENALTY + + movement_cost * actual_distance + + fall_cost + + CENTER_AFTER_FALL_COST; + Some((target, cost)) + } else { + None } - if !ctx.world.is_block_passable((pos + offset).up(2)) { - continue 'dir; + }) +} + +fn generate_height_checks(distance: i16) -> Vec<(i32, f32)> { + match distance { + 2 => vec![(1, 0.0), (0, 0.0)], + 3 => vec![ + (1, 0.0), + (0, FALL_N_BLOCKS_COST[1]), + (-1, FALL_N_BLOCKS_COST[2]), + ], + _ => { + let mut checks = Vec::with_capacity(5); + if distance <= 3 { + checks.push((1, 0.0)); } + checks.push((0, FALL_N_BLOCKS_COST[1])); + checks.extend((1..=3).map(|h| (-(h as i32), FALL_N_BLOCKS_COST[h]))); + checks } - // make sure there's not a block above us - if !ctx.world.is_block_passable(pos.up(2)) { - continue; - } - // make sure there's not a block above the target - if !ctx.world.is_block_passable((pos + offset).up(2)) { - continue; - } - - let cost = JUMP_PENALTY + SPRINT_ONE_BLOCK_COST * 4. + CENTER_AFTER_FALL_COST; - - ctx.edges.push(Edge { - movement: astar::Movement { - target: pos + offset, - data: MoveData { - execute: &execute_parkour_move, - is_reached: &parkour_is_reached, - }, - }, - cost, - }) } } fn execute_parkour_move(mut ctx: ExecuteCtx) { - let ExecuteCtx { - position, - target, - start, - .. - } = ctx; - - let start_center = start.center(); - let target_center = target.center(); - - let jump_distance = i32::max((target - start).x.abs(), (target - start).z.abs()); - - let ascend: i32 = target.y - start.y; - - if jump_distance >= 4 || (ascend > 0 && jump_distance >= 3) { - // 3 block gap OR 2 block gap with ascend + let delta = ctx.target - ctx.start; + let jump_distance = (delta.x as f64).hypot(delta.z as f64); + + if jump_distance >= 3.0 { ctx.sprint(SprintDirection::Forward); } else { ctx.walk(WalkDirection::Forward); } - let x_dir = (target.x - start.x).clamp(-1, 1); - let z_dir = (target.z - start.z).clamp(-1, 1); - let dir = BlockPos::new(x_dir, 0, z_dir); - let jump_at_pos = start + dir; - - let is_at_start_block = player_pos_to_block_pos(position) == start; - let is_at_jump_block = player_pos_to_block_pos(position) == jump_at_pos; - - let required_distance_from_center = if jump_distance <= 2 { - // 1 block gap - 0.0 - } else { - 0.6 - }; - let distance_from_start = f64::max( - (position.x - start_center.x).abs(), - (position.z - start_center.z).abs(), - ); - - if !is_at_start_block - && !is_at_jump_block - && (position.y - start.y as f64) < 0.094 - && distance_from_start < 0.85 - { - // we have to be on the start block to jump - ctx.look_at(start_center); - trace!("looking at start_center"); - } else { - ctx.look_at(target_center); - trace!("looking at target_center"); - } - - if !is_at_start_block && is_at_jump_block && distance_from_start > required_distance_from_center - { + let should_jump = [(delta.x, ctx.start.x, ctx.position.x), (delta.z, ctx.start.z, ctx.position.z)] + .iter() + .any(|&(d, start, pos)| { + if d == 0 { return false } + + let edge = if d > 0 { start + 1 } else { start } as f64; + (d > 0 && pos >= edge) || (d < 0 && pos <= edge) + }); + + ctx.look_at(ctx.target.center()); + + if should_jump { ctx.jump(); } } #[must_use] -pub fn parkour_is_reached( - IsReachedCtx { - position, - target, - physics, - .. - }: IsReachedCtx, -) -> bool { - // 0.094 and not 0 for lilypads - if player_pos_to_block_pos(position) == target && (position.y - target.y as f64) < 0.094 { - return true; - } - - // this is to make it handle things like slabs correctly - player_pos_to_block_pos(position) == target && physics.on_ground() +pub fn parkour_is_reached(ctx: IsReachedCtx) -> bool { + player_pos_to_block_pos(ctx.position) == ctx.target + && (ctx.position.y - (ctx.target.y as f64) < 0.094 || ctx.physics.on_ground()) } From 9c010c8e6abd20b9ea6916936a0a0928e68f9159 Mon Sep 17 00:00:00 2001 From: suprohub Date: Sun, 2 Nov 2025 19:00:29 +0300 Subject: [PATCH 2/6] Make realistic one benchmark --- Cargo.lock | 765 +++++++++++++++++- Cargo.toml | 2 + azalea/Cargo.toml | 8 +- .../assets/simple/Getting over it.litematic | Bin 0 -> 121501 bytes ...o LABYRINTH (by TriscuitsAllDay).litematic | Bin 0 -> 10759 bytes azalea/benches/assets/simple/Tiny.litematic | Bin 0 -> 498 bytes azalea/benches/realistic_one.rs | 145 ++++ azalea/src/pathfinder/moves/parkour.rs | 25 +- 8 files changed, 930 insertions(+), 15 deletions(-) create mode 100644 azalea/benches/assets/simple/Getting over it.litematic create mode 100644 azalea/benches/assets/simple/The Jumbo LABYRINTH (by TriscuitsAllDay).litematic create mode 100644 azalea/benches/assets/simple/Tiny.litematic create mode 100644 azalea/benches/realistic_one.rs diff --git a/Cargo.lock b/Cargo.lock index fcd91de4..8755d5a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,12 +37,30 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "android_log-sys" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anes" version = "0.1.6" @@ -105,6 +123,23 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -207,6 +242,29 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +dependencies = [ + "arrayvec", +] + [[package]] name = "azalea" version = "0.14.0+mc1.21.10" @@ -234,12 +292,14 @@ dependencies = [ "futures", "futures-lite", "indexmap", + "mcdata", "nohash-hasher", "num-format", "num-traits", "parking_lot", "rand 0.9.2", "rustc-hash", + "rustmatica", "serde", "thiserror 2.0.17", "tokio", @@ -701,7 +761,7 @@ dependencies = [ "proc-macro2", "quote", "syn", - "toml_edit", + "toml_edit 0.23.7", ] [[package]] @@ -816,6 +876,12 @@ dependencies = [ "thread_local", ] +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "2.9.4" @@ -825,6 +891,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block-buffer" version = "0.10.4" @@ -843,6 +915,21 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bounded-integer" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "102dbef1187b1893e6dfe05a774e79fd52265f49f214f6879c8ff49f52c8188b" +dependencies = [ + "serde", +] + +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.19.0" @@ -875,6 +962,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.1" @@ -903,9 +996,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfb8" version = "0.8.1" @@ -915,6 +1016,16 @@ dependencies = [ "cipher", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.3" @@ -933,8 +1044,12 @@ version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ + "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", + "windows-link", ] [[package]] @@ -999,6 +1114,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.4" @@ -1046,6 +1167,12 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dabb6555f92fb9ee4140454eb5dcd14c7960e1225c6d1a6cc361f032947713e" +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1084,7 +1211,7 @@ dependencies = [ "ciborium", "clap", "criterion-plot", - "itertools", + "itertools 0.13.0", "num-traits", "oorandom", "plotters", @@ -1103,7 +1230,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", - "itertools", + "itertools 0.13.0", ] [[package]] @@ -1308,6 +1435,9 @@ name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "enum-as-inner" @@ -1344,6 +1474,26 @@ dependencies = [ "log", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1382,12 +1532,68 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastnbt" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e3bb1f9ba8b6dbb35d89b415216041c2cad0c3e0b329db85ef5d4fc9e80cd6" +dependencies = [ + "byteorder", + "cesu8", + "serde", + "serde_bytes", +] + [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "find-msvc-tools" version = "0.1.4" @@ -1577,6 +1783,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.32.3" @@ -1796,6 +2012,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -1903,6 +2143,46 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + [[package]] name = "indexmap" version = "2.11.4" @@ -1922,6 +2202,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "io-uring" version = "0.7.10" @@ -1967,6 +2258,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2006,6 +2306,16 @@ dependencies = [ "syn", ] +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + [[package]] name = "js-sys" version = "0.3.81" @@ -2022,12 +2332,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "libc" version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +[[package]] +name = "libfuzzer-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libm" version = "0.2.15" @@ -2064,6 +2390,15 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -2079,6 +2414,29 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "mcdata" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d9308b6ccaae33eb8acf71b02edc136421f0d75ba1adbfc78003b6151fd82d" +dependencies = [ + "bounded-integer", + "either", + "fastnbt", + "serde", + "strum", +] + [[package]] name = "md-5" version = "0.10.6" @@ -2140,6 +2498,22 @@ dependencies = [ "uuid", ] +[[package]] +name = "moxcms" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.30.1" @@ -2158,12 +2532,27 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nonmax" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2206,6 +2595,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-format" version = "0.4.4" @@ -2318,6 +2718,12 @@ dependencies = [ "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pastey" version = "0.1.1" @@ -2401,6 +2807,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "plotters" version = "0.3.7" @@ -2429,6 +2841,19 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "portable-atomic" version = "1.11.1" @@ -2471,6 +2896,49 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "pxfm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +dependencies = [ + "num-traits", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quinn" version = "0.11.9" @@ -2600,6 +3068,56 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "rayon" version = "1.11.0" @@ -2702,6 +3220,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" + [[package]] name = "ring" version = "0.17.14" @@ -2803,6 +3327,22 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustmatica" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3156b8b799e73cc20ecd5c04447cc4e5093a22434c1fb13ae058d91a8ba7776f" +dependencies = [ + "chrono", + "fastnbt", + "flate2", + "image", + "js-sys", + "mcdata", + "serde", + "thiserror 2.0.17", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -2846,6 +3386,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -2879,6 +3429,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2973,6 +3532,15 @@ dependencies = [ "simdutf8", ] +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simdnbt" version = "0.8.0" @@ -3108,6 +3676,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3145,12 +3735,31 @@ dependencies = [ "syn", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + [[package]] name = "tagptr" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "thiserror" version = "1.0.69" @@ -3200,6 +3809,20 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -3289,6 +3912,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.7.3" @@ -3298,6 +3942,19 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "winnow", +] + [[package]] name = "toml_edit" version = "0.23.7" @@ -3305,7 +3962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap", - "toml_datetime", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] @@ -3521,6 +4178,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -3538,6 +4206,12 @@ dependencies = [ "syn", ] +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + [[package]] name = "version_check" version = "0.9.5" @@ -3688,6 +4362,12 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + [[package]] name = "wgpu-types" version = "26.0.0" @@ -3718,12 +4398,65 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -4095,3 +4828,27 @@ name = "zlib-rs" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index b9e7bcbe..a592b351 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,6 +83,8 @@ tokio-util = "0.7" tracing = "0.1" tracing-subscriber = "0.3" uuid = "1" +rustmatica = "0.5" +mcdata = { version = "0.4", features = ["latest"] } azalea-block-macros = { path = "azalea-block/azalea-block-macros", version = "0.14.0" } azalea-block = { path = "azalea-block", version = "0.14.0" } diff --git a/azalea/Cargo.toml b/azalea/Cargo.toml index ab6b83b2..2e6a839f 100644 --- a/azalea/Cargo.toml +++ b/azalea/Cargo.toml @@ -49,6 +49,8 @@ parking_lot = { workspace = true, features = ["deadlock_detection"] } rand.workspace = true anyhow.workspace = true bevy_log.workspace = true +rustmatica.workspace = true +mcdata.workspace = true [features] default = ["log", "serde", "packet-event"] @@ -57,6 +59,10 @@ log = ["azalea-client/log"] serde = ["dep:serde", "azalea-registry/serde", "azalea-world/serde"] packet-event = ["azalea-client/packet-event"] +[[bench]] +name = "checks" +harness = false + [[bench]] name = "pathfinder" harness = false @@ -66,5 +72,5 @@ name = "physics" harness = false [[bench]] -name = "checks" +name = "realistic_one" harness = false diff --git a/azalea/benches/assets/simple/Getting over it.litematic b/azalea/benches/assets/simple/Getting over it.litematic new file mode 100644 index 0000000000000000000000000000000000000000..6ba42f8823800a40ccf2414655f9b7057afd50d8 GIT binary patch literal 121501 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 PPY{ojUpaeqNI~r1n=ck- literal 0 HcmV?d00001 diff --git a/azalea/benches/assets/simple/The Jumbo LABYRINTH (by TriscuitsAllDay).litematic b/azalea/benches/assets/simple/The Jumbo LABYRINTH (by TriscuitsAllDay).litematic new file mode 100644 index 0000000000000000000000000000000000000000..e5a5c4e5b36aaedcf2ef692c49234cfd0ada9791 GIT binary patch literal 10759 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 o^WUe>rFXwe@, + partial_chunks: &mut PartialChunkStorage, + size: u32, +) -> Result<(ChunkStorage, BlockPos, BlockPos)> { + let size = size as i32; + let mut chunks = ChunkStorage::default(); + + for chunk_x in -size..size { + for chunk_z in -size..size { + let chunk_pos = ChunkPos::new(chunk_x, chunk_z); + partial_chunks.set(&chunk_pos, Some(Chunk::default()), &mut chunks); + } + } + + let (mut start, mut end) = (BlockPos::new(0, 0, 0), BlockPos::new(0, 0, 0)); + let litematic: Litematic = Litematic::read_file(path)?; + + for region in litematic.regions { + for (p, state) in region.blocks() { + let p = BlockPos::new(p.x, p.y, p.z); + let block = Block::from_str(&state.name).map_err(|e| anyhow!("{e}"))?; + + match block { + Block::CommandBlock => start = p.up(1), + Block::DiamondBlock => end = p.up(1), + _ => {} + } + + chunks.set_block_state( + BlockPos::new(p.x, p.y, p.z), + BlockState::try_from(block.to_u32()).map_err(|_| anyhow!("BlockState invalid"))?, + ); + } + } + + Ok((chunks, start, end)) +} + +fn bench_pathfinder(c: &mut Criterion) { + bench_folder(c, "benches/assets/simple", false); + bench_folder(c, "benches/assets/mine", true); +} + +fn bench_folder(c: &mut Criterion, folder: &str, mine: bool) { + let mut entries = vec![]; + for file in fs::read_dir(folder).unwrap() { + let path = file.unwrap().path(); + let name = path + .file_name() + .unwrap() + .to_str() + .unwrap() + .trim_end_matches(".litematic") + .to_string(); + entries.push((path, name)); + } + + for (path, name) in entries { + let mut partial_chunks = PartialChunkStorage::new(32); + let (world, start, end) = load_litematic(path, &mut partial_chunks, 16).unwrap(); + println!("Bench: {name}, Start: {start}, End: {end}"); + + if iteration(&world, start, end, mine) { + println!( + "Partial path getted, its a bug. It maybe can works in non-test enviroment, but its must be fixed." + ); + continue; + } + + c.bench_function(&name, |b| { + b.iter(|| { + iteration(&world, start, end, mine); + }); + }); + } +} + +fn iteration(world: &ChunkStorage, start: BlockPos, end: BlockPos, mine: bool) -> bool { + let cached_world = CachedWorld::new(Arc::new(RwLock::new(world.clone().into())), start); + let mining_cache = MiningCache::new(if mine { + Some(Menu::Player(azalea_inventory::Player::default())) + } else { + None + }); + let goal = BlockPosGoal(end); + + let successors = |pos: RelBlockPos| { + azalea::pathfinder::call_successors_fn( + &cached_world, + &mining_cache, + &CustomPathfinderStateRef::default(), + azalea::pathfinder::moves::default_move, + pos, + ) + }; + + let astar::Path { + movements, + is_partial: partial, + } = a_star( + RelBlockPos::get_origin(start), + |n| goal.heuristic(n.apply(start)), + successors, + |n| goal.success(n.apply(start)), + PathfinderTimeout::Time(Duration::MAX), + PathfinderTimeout::Time(Duration::MAX), + ); + + black_box((movements, partial)); + + partial +} + +criterion_group!(benches, bench_pathfinder); +criterion_main!(benches); diff --git a/azalea/src/pathfinder/moves/parkour.rs b/azalea/src/pathfinder/moves/parkour.rs index b65cd676..fd2180b6 100644 --- a/azalea/src/pathfinder/moves/parkour.rs +++ b/azalea/src/pathfinder/moves/parkour.rs @@ -145,24 +145,29 @@ fn generate_height_checks(distance: i16) -> Vec<(i32, f32)> { fn execute_parkour_move(mut ctx: ExecuteCtx) { let delta = ctx.target - ctx.start; let jump_distance = (delta.x as f64).hypot(delta.z as f64); - + if jump_distance >= 3.0 { ctx.sprint(SprintDirection::Forward); } else { ctx.walk(WalkDirection::Forward); } - let should_jump = [(delta.x, ctx.start.x, ctx.position.x), (delta.z, ctx.start.z, ctx.position.z)] - .iter() - .any(|&(d, start, pos)| { - if d == 0 { return false } - - let edge = if d > 0 { start + 1 } else { start } as f64; - (d > 0 && pos >= edge) || (d < 0 && pos <= edge) - }); + let should_jump = [ + (delta.x, ctx.start.x, ctx.position.x), + (delta.z, ctx.start.z, ctx.position.z), + ] + .iter() + .any(|&(d, start, pos)| { + if d == 0 { + return false; + } + + let edge = if d > 0 { start + 1 } else { start } as f64; + (d > 0 && pos >= edge) || (d < 0 && pos <= edge) + }); ctx.look_at(ctx.target.center()); - + if should_jump { ctx.jump(); } From aae76b30820270c37b293720074b6859c9ec0139 Mon Sep 17 00:00:00 2001 From: suprohub Date: Sun, 2 Nov 2025 23:24:02 +0300 Subject: [PATCH 3/6] Add lto = "thin" --- Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index a592b351..3c74af46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -112,6 +112,9 @@ azalea-world = { path = "azalea-world", version = "0.14.0" } [profile.release] debug = true +[profile.bench] +lto = "thin" + # decoding packets takes forever if we don't do this [profile.dev.package.azalea-crypto] opt-level = 3 From 3be6195fa21ad58e1545a5610afbffed1896b020 Mon Sep 17 00:00:00 2001 From: suprohub Date: Sun, 2 Nov 2025 23:39:52 +0300 Subject: [PATCH 4/6] More cooler benchmarks --- azalea/benches/realistic_one.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/azalea/benches/realistic_one.rs b/azalea/benches/realistic_one.rs index 4bd3ff12..9e7272f9 100644 --- a/azalea/benches/realistic_one.rs +++ b/azalea/benches/realistic_one.rs @@ -22,7 +22,7 @@ use azalea_core::position::ChunkPos; use azalea_inventory::Menu; use azalea_registry::{Block, Registry}; use azalea_world::{Chunk, ChunkStorage, PartialChunkStorage}; -use criterion::{Criterion, criterion_group, criterion_main}; +use criterion::{BatchSize, Criterion, criterion_group, criterion_main}; use mcdata::GenericBlockState; use parking_lot::RwLock; use rustmatica::Litematic; @@ -90,7 +90,8 @@ fn bench_folder(c: &mut Criterion, folder: &str, mine: bool) { let (world, start, end) = load_litematic(path, &mut partial_chunks, 16).unwrap(); println!("Bench: {name}, Start: {start}, End: {end}"); - if iteration(&world, start, end, mine) { + let (cached_world, mining_cache) = setup(&world, start, mine); + if iteration(cached_world, mining_cache, start, end) { println!( "Partial path getted, its a bug. It maybe can works in non-test enviroment, but its must be fixed." ); @@ -98,20 +99,33 @@ fn bench_folder(c: &mut Criterion, folder: &str, mine: bool) { } c.bench_function(&name, |b| { - b.iter(|| { - iteration(&world, start, end, mine); - }); + b.iter_batched( + || setup(&world, start, mine), + |(cached_world, mining_cache)| { + iteration(cached_world, mining_cache, start, end); + }, + BatchSize::SmallInput, + ); }); } } -fn iteration(world: &ChunkStorage, start: BlockPos, end: BlockPos, mine: bool) -> bool { +fn setup(world: &ChunkStorage, start: BlockPos, mine: bool) -> (CachedWorld, MiningCache) { let cached_world = CachedWorld::new(Arc::new(RwLock::new(world.clone().into())), start); let mining_cache = MiningCache::new(if mine { Some(Menu::Player(azalea_inventory::Player::default())) } else { None }); + (cached_world, mining_cache) +} + +fn iteration( + cached_world: CachedWorld, + mining_cache: MiningCache, + start: BlockPos, + end: BlockPos, +) -> bool { let goal = BlockPosGoal(end); let successors = |pos: RelBlockPos| { From 13743a24a2d3e01f10d90185ce07fa75680d8c48 Mon Sep 17 00:00:00 2001 From: suprohub Date: Mon, 3 Nov 2025 13:18:20 +0300 Subject: [PATCH 5/6] Fix measure time --- azalea/benches/realistic_one.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azalea/benches/realistic_one.rs b/azalea/benches/realistic_one.rs index 9e7272f9..cf53a993 100644 --- a/azalea/benches/realistic_one.rs +++ b/azalea/benches/realistic_one.rs @@ -72,6 +72,9 @@ fn bench_pathfinder(c: &mut Criterion) { } fn bench_folder(c: &mut Criterion, folder: &str, mine: bool) { + let mut g = c.benchmark_group("realistic benches"); + let c = g.measurement_time(Duration::from_secs(10)); + let mut entries = vec![]; for file in fs::read_dir(folder).unwrap() { let path = file.unwrap().path(); From 2358823be580967f630ae2710c4e8c8f8529a1b8 Mon Sep 17 00:00:00 2001 From: suprohub Date: Mon, 3 Nov 2025 13:28:05 +0300 Subject: [PATCH 6/6] Fix measure time (again) --- azalea/benches/realistic_one.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azalea/benches/realistic_one.rs b/azalea/benches/realistic_one.rs index cf53a993..70e43aac 100644 --- a/azalea/benches/realistic_one.rs +++ b/azalea/benches/realistic_one.rs @@ -73,7 +73,7 @@ fn bench_pathfinder(c: &mut Criterion) { fn bench_folder(c: &mut Criterion, folder: &str, mine: bool) { let mut g = c.benchmark_group("realistic benches"); - let c = g.measurement_time(Duration::from_secs(10)); + let c = g.measurement_time(Duration::from_secs(20)); let mut entries = vec![]; for file in fs::read_dir(folder).unwrap() {