steel_core/worldgen/feature/features/
seagrass.rs1use 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}