Pumpkin/pumpkin-world/src/generation/feature/features/sea_pickle.rs
2026-01-30 00:57:55 +01:00

48 lines
1.6 KiB
Rust

use crate::generation::proto_chunk::GenerationCache;
use pumpkin_data::{
Block, BlockState,
block_properties::{BlockProperties, EnumVariants, Integer1To4, SeaPickleLikeProperties},
};
use pumpkin_util::{
math::{int_provider::IntProvider, position::BlockPos},
random::{RandomGenerator, RandomImpl},
};
use serde::Deserialize;
#[derive(Deserialize)]
pub struct SeaPickleFeature {
count: IntProvider,
}
impl SeaPickleFeature {
pub fn generate<T: GenerationCache>(
&self,
chunk: &mut T,
_min_y: i8,
_height: u16,
_feature: &str, // This placed feature
random: &mut RandomGenerator,
pos: BlockPos,
) -> bool {
let mut times = 0;
let count = self.count.get(random);
for _ in 0..count {
let x = random.next_bounded_i32(8) - random.next_bounded_i32(8);
let z = random.next_bounded_i32(8) - random.next_bounded_i32(8);
let y = chunk.ocean_floor_height_exclusive(pos.0.x + x, pos.0.z + z);
if GenerationCache::get_block_state(chunk, &pos.0).to_block_id() != Block::WATER {
continue;
}
let mut props = SeaPickleLikeProperties::default(&Block::SEA_PICKLE);
props.pickles = Integer1To4::from_index(random.next_bounded_i32(4) as u16); // TODO: vanilla adds + 1, but this can crash
let pos = BlockPos::new(pos.0.x + x, y, pos.0.z + z);
chunk.set_block_state(
&pos.0,
BlockState::from_id(props.to_state_id(&Block::SEA_PICKLE)),
);
times += 1;
}
times > 0
}
}