Pumpkin/pumpkin-world/src/generation/feature/features/tree/foliage/acacia.rs
2026-07-03 18:51:47 +02:00

80 lines
2.0 KiB
Rust

use pumpkin_data::BlockState;
use pumpkin_util::{math::position::BlockPos, random::RandomGenerator};
use super::{FoliagePlacer, LeaveValidator};
use crate::generation::feature::features::tree::TreeNode;
use crate::generation::proto_chunk::GenerationCache;
pub struct AcaciaFoliagePlacer;
impl AcaciaFoliagePlacer {
#[expect(clippy::too_many_arguments)]
pub fn generate<T: GenerationCache>(
&self,
chunk: &mut T,
random: &mut RandomGenerator,
node: &TreeNode,
foliage_height: i32,
radius: i32,
_offset: i32,
foliage_provider: &BlockState,
) -> Vec<BlockPos> {
let mut foliage_positions = Vec::new();
FoliagePlacer::generate_square(
&mut foliage_positions,
self,
chunk,
random,
node.center,
radius + node.foliage_radius,
-1,
node.giant_trunk,
foliage_provider,
);
FoliagePlacer::generate_square(
&mut foliage_positions,
self,
chunk,
random,
node.center,
radius - 1,
-foliage_height,
node.giant_trunk,
foliage_provider,
);
FoliagePlacer::generate_square(
&mut foliage_positions,
self,
chunk,
random,
node.center,
radius + node.foliage_radius - 1,
0,
node.giant_trunk,
foliage_provider,
);
foliage_positions
}
pub const fn get_random_height(_random: &mut RandomGenerator) -> i32 {
0
}
}
impl LeaveValidator for AcaciaFoliagePlacer {
fn is_invalid_for_leaves(
&self,
_random: &mut pumpkin_util::random::RandomGenerator,
dx: i32,
y: i32,
dz: i32,
radius: i32,
_giant_trunk: bool,
) -> bool {
if y == 0 {
return (dx > 1 || dz > 1) && dx != 0 && dz != 0;
}
dx == radius && dz == radius && radius > 0
}
}