Alexander Medvedev 2026-04-21 21:45:26 +02:00
parent be4496c25b
commit b5b1c0727c
4 changed files with 25 additions and 56 deletions

View File

@ -360,8 +360,6 @@ impl Cache {
self.chunks[mid].get_proto_chunk_mut().set_structure_starts(
random_config,
settings,
&dimension,
noise_router,
global_structure_cache,
);
}

View File

@ -764,24 +764,15 @@ impl ProtoChunk {
noise_sampler.interpolate_z(local_z as f64 * delta_x_z_step);
let block_z = block_z_base + local_z;
// The `cell_offset` calculations are still a good idea for clarity and correctness
// but let's confirm the values.
// block_x = start_block_x + cell_x*H + local_x
// sample_start_x = start_cell_x*H + cell_x*H = (start_cell_x+cell_x)*H
// These can be simplified.
let cell_offset_x = local_x;
let cell_offset_y = block_y - sample_start_y;
let cell_offset_z = local_z;
let block_state = noise_sampler
.sample_block_state(
ore_random_deriver,
sample_start_x,
sample_start_y,
sample_start_z,
cell_offset_x,
cell_offset_y,
cell_offset_z,
local_x,
block_y - sample_start_y,
local_z,
surface_height_estimate_sampler,
)
.unwrap_or(self.default_block);
@ -1132,32 +1123,11 @@ impl ProtoChunk {
&mut self,
random_config: &GlobalRandomConfig,
settings: &GenerationSettings,
dimension: &Dimension, // <-- Added Parameter
noise_router: &ProtoNoiseRouters, // <-- Added Parameter
global_cache: &GlobalStructureCache,
) {
let seed = random_config.seed;
let calculator = StructurePlacementCalculator::new(seed as i64);
// Initialize mathematical biome tools for ConcentricRings snapping
let active_supplier = if *dimension == Dimension::THE_END {
ActiveSupplier::End(TheEndBiomeSupplier)
} else if *dimension == Dimension::THE_NETHER {
ActiveSupplier::Nether(MultiNoiseBiomeSupplier::NETHER)
} else {
ActiveSupplier::Overworld(MultiNoiseBiomeSupplier::OVERWORLD)
};
let base_supplier: &dyn BiomeSupplier = match &active_supplier {
ActiveSupplier::End(s) => s,
ActiveSupplier::Nether(s) => s,
ActiveSupplier::Overworld(s) => s,
};
let biome_supplier = Blender::NO_BLEND.get_biome_supplier(base_supplier);
let multi_noise_config = MultiNoiseSamplerBuilderOptions::new(0, 0, 0);
let mut multi_noise_sampler =
MultiNoiseSampler::generate(&noise_router.multi_noise, &multi_noise_config);
for set in StructureSet::ALL {
let allowed_biomes = Self::get_allowed_biomes(set);
@ -1167,8 +1137,7 @@ impl ProtoChunk {
self.x,
self.z,
global_cache,
&biome_supplier,
&mut multi_noise_sampler,
self,
&allowed_biomes,
) {
continue;
@ -1305,8 +1274,7 @@ impl ProtoChunk {
let strongholds = global_cache.get_or_calculate_strongholds(
seed,
rings,
&biome_supplier,
&mut multi_noise_sampler,
self,
&allowed_biomes,
);
for &(cx, cz) in strongholds {

View File

@ -12,8 +12,7 @@ use pumpkin_util::{
use std::f64::consts::PI;
use std::sync::OnceLock;
use crate::biome::BiomeSupplier;
use crate::generation::noise::router::multi_noise_sampler::MultiNoiseSampler;
use crate::ProtoChunk;
/// A thread-safe global cache for structures that require world-wide placement calculations
/// rather than localized chunk-based math (e.g., Strongholds using Concentric Rings).
///
@ -45,8 +44,7 @@ impl GlobalStructureCache {
&self,
seed: i64,
placement: &ConcentricRingsStructurePlacement,
biome_supplier: &dyn BiomeSupplier,
multi_noise_sampler: &mut MultiNoiseSampler,
biome_supplier: &ProtoChunk,
allowed_biomes: &[u16],
) -> &[(i32, i32)] {
self.stronghold_chunks.get_or_init(|| {
@ -100,12 +98,7 @@ impl GlobalStructureCache {
let test_x = center_block_x + dx;
let test_z = center_block_z + dz;
let biome_x = crate::generation::biome_coords::from_block(test_x);
let biome_y = crate::generation::biome_coords::from_block(0);
let biome_z = crate::generation::biome_coords::from_block(test_z);
let biome =
biome_supplier.biome(biome_x, biome_y, biome_z, multi_noise_sampler);
let biome = biome_supplier.get_biome(test_x, 0, test_z);
if allowed_biomes.contains(&(biome.id as u16)) {
found_count += 1;
@ -147,15 +140,14 @@ impl Default for GlobalStructureCache {
}
#[must_use]
#[expect(clippy::too_many_arguments)]
// #[expect(clippy::too_many_arguments)]
pub fn should_generate_structure(
placement: &StructurePlacement,
calculator: &StructurePlacementCalculator,
chunk_x: i32,
chunk_z: i32,
global_cache: &GlobalStructureCache,
biome_supplier: &dyn BiomeSupplier,
multi_noise_sampler: &mut MultiNoiseSampler,
biome_supplier: &ProtoChunk,
allowed_biomes: &[u16],
) -> bool {
is_start_chunk(
@ -166,7 +158,6 @@ pub fn should_generate_structure(
placement.salt,
global_cache,
biome_supplier,
multi_noise_sampler,
allowed_biomes,
) && apply_frequency_reduction(
placement.frequency_reduction_method,
@ -238,8 +229,7 @@ fn is_start_chunk(
chunk_z: i32,
salt: u32,
global_cache: &GlobalStructureCache,
biome_supplier: &dyn BiomeSupplier,
multi_noise_sampler: &mut MultiNoiseSampler,
biome_supplier: &ProtoChunk,
allowed_biomes: &[u16],
) -> bool {
match placement_type {
@ -251,7 +241,6 @@ fn is_start_chunk(
calculator.seed,
placement,
biome_supplier,
multi_noise_sampler,
allowed_biomes,
);
strongholds.contains(&(chunk_x, chunk_z))

View File

@ -10,6 +10,7 @@ use pumpkin_data::entity::EntityType;
use pumpkin_data::item::Item;
use pumpkin_data::item_stack::ItemStack;
use pumpkin_data::{Block, BlockDirection};
use pumpkin_util::math::boundingbox::BoundingBox;
use pumpkin_util::math::position::BlockPos;
use pumpkin_util::math::vector3::Vector3;
@ -40,6 +41,19 @@ impl ItemBehaviour for EndCrystalItem {
}
let location = location.up();
let location_vec = location.0.to_f64();
if !world.get_block_state(&location).await.is_air()
|| !world
.get_entities_at_box(&BoundingBox::new(
Vector3::new(location_vec.x, location_vec.y, location_vec.z),
Vector3::new(location_vec.x + 1.0, location_vec.y + 2.0, location_vec.z),
))
.is_empty()
{
return;
}
let entity = Entity::new(world.clone(), location.to_f64(), &EntityType::END_CRYSTAL);
let end_crystal = Arc::new(EndCrystalEntity::new(entity));
world.spawn_entity(end_crystal.clone()).await;