Skip to main content

steel_core/worldgen/feature/features/
kelp.rs

1use super::super::prelude::*;
2use super::super::runner::FeatureDecorationRunner;
3
4impl FeatureDecorationRunner {
5    pub(in crate::worldgen::feature) fn place_kelp_feature(
6        region: &mut WorldGenRegion<'_>,
7        random: &mut WorldgenRandom,
8        origin: BlockPos,
9    ) -> bool {
10        let mut placed = 0;
11        let y = region.height_at(HeightmapType::OceanFloor, origin.x(), origin.z());
12        let mut kelp_pos = BlockPos::new(origin.x(), y, origin.z());
13
14        if region.block_state(kelp_pos).get_block() != &vanilla_blocks::WATER {
15            return false;
16        }
17
18        let kelp_head = vanilla_blocks::KELP.default_state();
19        let kelp_plant = vanilla_blocks::KELP_PLANT.default_state();
20        let kelp_plant_behavior = BLOCK_BEHAVIORS.get_behavior(&vanilla_blocks::KELP_PLANT);
21        let kelp_head_behavior = BLOCK_BEHAVIORS.get_behavior(&vanilla_blocks::KELP);
22        let height = 1 + random.next_i32_bounded(10);
23
24        for h in 0..=height {
25            if region.block_state(kelp_pos).get_block() == &vanilla_blocks::WATER
26                && region.block_state(kelp_pos.above()).get_block() == &vanilla_blocks::WATER
27                && kelp_plant_behavior.can_survive(kelp_plant, region, kelp_pos)
28            {
29                if h == height {
30                    let state = Self::aged_kelp_head(kelp_head, random);
31                    let _ = region.set_block_state(kelp_pos, state, UpdateFlags::UPDATE_CLIENTS);
32                    placed += 1;
33                } else {
34                    let _ =
35                        region.set_block_state(kelp_pos, kelp_plant, UpdateFlags::UPDATE_CLIENTS);
36                }
37            } else if h > 0 {
38                let below = kelp_pos.below();
39                if kelp_head_behavior.can_survive(kelp_head, region, below)
40                    && region.block_state(below.below()).get_block() != &vanilla_blocks::KELP
41                {
42                    let state = Self::aged_kelp_head(kelp_head, random);
43                    let _ = region.set_block_state(below, state, UpdateFlags::UPDATE_CLIENTS);
44                    placed += 1;
45                }
46                break;
47            }
48
49            kelp_pos = kelp_pos.above();
50        }
51
52        placed > 0
53    }
54
55    fn aged_kelp_head(state: BlockStateId, random: &mut WorldgenRandom) -> BlockStateId {
56        let age = (random.next_i32_bounded(4) + 20) as u8;
57        state.set_value(&BlockStateProperties::AGE_25, age)
58    }
59}