Pumpkin/pumpkin-world/src/generation/feature/features/bamboo.rs
2026-05-09 20:59:34 +02:00

88 lines
3.1 KiB
Rust

use pumpkin_data::{
Block, BlockState,
block_properties::{BambooLeaves, BambooLikeProperties, BlockProperties},
tag,
};
use pumpkin_util::{
math::position::BlockPos,
random::{RandomGenerator, RandomImpl},
};
use crate::generation::proto_chunk::GenerationCache;
use crate::world::WorldPortalExt;
pub struct BambooFeature {
pub probability: f32,
}
impl BambooFeature {
#[expect(clippy::too_many_arguments)]
pub fn generate<T: GenerationCache>(
&self,
chunk: &mut T,
block_registry: &dyn WorldPortalExt,
_min_y: i8,
_height: u16,
_feature: &str, // This placed feature
random: &mut RandomGenerator,
pos: BlockPos,
) -> bool {
let mut i = 0;
if chunk.is_air(&pos.0) {
if block_registry.can_place_at(&Block::BAMBOO, Block::BAMBOO.default_state, chunk, &pos)
{
let height = random.next_bounded_i32(12) + 5;
if random.next_f32() < self.probability {
let rnd = random.next_bounded_i32(4) + 1;
for x in pos.0.x - rnd..pos.0.x + rnd {
for z in pos.0.z - rnd..pos.0.z + rnd {
let block_below =
BlockPos::new(x, chunk.top_block_height_exclusive(x, z) - 1, z);
let block = GenerationCache::get_block_state(chunk, &block_below.0);
if !tag::Block::MINECRAFT_DIRT.1.contains(&block.to_block_id()) {
continue;
}
chunk.set_block_state(&block_below.0, Block::PODZOL.default_state);
}
}
}
let mut bpos = pos;
let bamboo = Block::BAMBOO.default_state;
for _ in 0..height {
if chunk.is_air(&bpos.0) {
chunk.set_block_state(&bpos.0, bamboo);
bpos = bpos.up();
} else {
break;
}
}
// Top block
if bpos.0.y - pos.0.y >= 3 {
let mut props = BambooLikeProperties::default(&Block::BAMBOO);
props.leaves = BambooLeaves::Large;
props.stage = 1;
chunk.set_block_state(
&bpos.0,
BlockState::from_id(props.to_state_id(&Block::BAMBOO)),
);
props.stage = 0;
chunk.set_block_state(
&bpos.down().0,
BlockState::from_id(props.to_state_id(&Block::BAMBOO)),
);
props.leaves = BambooLeaves::Small;
chunk.set_block_state(
&bpos.down().down().0,
BlockState::from_id(props.to_state_id(&Block::BAMBOO)),
);
}
}
i += 1;
}
i > 0
}
}