chunkgen 0.2.0

Minecraft world generation library
Documentation
use crate::util::rng::RandomSource;
use crate::world::worldgen::feature::features::ore::{OreConfig, can_place_ore};
use crate::world::worldgen::region::WorldGenRegion;
use shulkr::util::BlockPosition;

const MAX_DIST_FROM_ORIGIN: i32 = 7;

pub fn place(
    region: &WorldGenRegion<'_>,
    random: &mut RandomSource,
    origin: BlockPosition,
    config: &OreConfig,
) -> bool {
    let number_of_tries = random.next_i32_bounded(config.size + 1);

    for i in 0..number_of_tries {
        let target_pos = offset_target_pos(random, origin, i.min(MAX_DIST_FROM_ORIGIN));
        let state = region.get_block(target_pos);

        for target in &config.targets {
            if can_place_ore(state, region, random, config, target, target_pos) {
                region.set_block(target_pos, target.state);
                break;
            }
        }
    }

    true
}

fn offset_target_pos(
    random: &mut RandomSource,
    origin: BlockPosition,
    max_dist_from_origin: i32,
) -> BlockPosition {
    let dx = random_placement_in_one_axis(random, max_dist_from_origin);
    let dy = random_placement_in_one_axis(random, max_dist_from_origin);
    let dz = random_placement_in_one_axis(random, max_dist_from_origin);
    origin.offset(dx, dy, dz)
}

fn random_placement_in_one_axis(random: &mut RandomSource, max_distance_from_origin: i32) -> i32 {
    let offset = (random.next_f32() - random.next_f32()) * max_distance_from_origin as f32;
    (offset + 0.5).floor() as i32
}