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