Skip to main content

steel_core/worldgen/feature/features/
seagrass.rs

1use super::super::prelude::*;
2use super::super::runner::FeatureDecorationRunner;
3
4impl FeatureDecorationRunner {
5    pub(in crate::worldgen::feature) fn place_seagrass_feature(
6        region: &mut WorldGenRegion<'_>,
7        random: &mut WorldgenRandom,
8        config: &SeagrassConfiguration,
9        origin: BlockPos,
10    ) -> bool {
11        let x = random.next_i32_bounded(8) - random.next_i32_bounded(8);
12        let z = random.next_i32_bounded(8) - random.next_i32_bounded(8);
13        let y = region.height_at(HeightmapType::OceanFloor, origin.x() + x, origin.z() + z);
14        let grass_pos = BlockPos::new(origin.x() + x, y, origin.z() + z);
15
16        if region.block_state(grass_pos).get_block() != &vanilla_blocks::WATER {
17            return false;
18        }
19
20        let is_tall = random.next_f64() < f64::from(config.probability);
21        let state = if is_tall {
22            vanilla_blocks::TALL_SEAGRASS.default_state().set_value(
23                &BlockStateProperties::DOUBLE_BLOCK_HALF,
24                DoubleBlockHalf::Lower,
25            )
26        } else {
27            vanilla_blocks::SEAGRASS.default_state()
28        };
29        let behavior = BLOCK_BEHAVIORS.get_behavior(state.get_block());
30        if !behavior.can_survive(state, region, grass_pos) {
31            return false;
32        }
33
34        if is_tall {
35            let upper_pos = grass_pos.above();
36            if region.block_state(upper_pos).get_block() == &vanilla_blocks::WATER {
37                let upper_state = state.set_value(
38                    &BlockStateProperties::DOUBLE_BLOCK_HALF,
39                    DoubleBlockHalf::Upper,
40                );
41                let _ = region.set_block_state(grass_pos, state, UpdateFlags::UPDATE_CLIENTS);
42                let _ = region.set_block_state(upper_pos, upper_state, UpdateFlags::UPDATE_CLIENTS);
43            }
44        } else {
45            let _ = region.set_block_state(grass_pos, state, UpdateFlags::UPDATE_CLIENTS);
46        }
47
48        true
49    }
50}