diff --git a/pumpkin-world/src/level.rs b/pumpkin-world/src/level.rs index 8e947e950..a283b180c 100644 --- a/pumpkin-world/src/level.rs +++ b/pumpkin-world/src/level.rs @@ -97,11 +97,8 @@ pub struct Level { pub level_channel: Arc, pub thread_tracker: Mutex>>, pub chunk_listener: Arc, - - pub tick_data: tokio::sync::Mutex, } -#[derive(Default)] pub struct TickData { pub block_ticks: Vec>, pub fluid_ticks: Vec>, @@ -204,7 +201,6 @@ impl Level { level_channel: level_channel.clone(), thread_tracker, chunk_listener: listener.clone(), - tick_data: tokio::sync::Mutex::new(TickData::default()), }); let num_threads = num_cpus::get().saturating_sub(2).max(1); @@ -496,9 +492,13 @@ impl Level { } // Gets random ticks, block ticks and fluid ticks - pub async fn get_tick_data(&self) { - let mut ticks = self.tick_data.lock().await; - ticks.clear(); + pub async fn get_tick_data(&self) -> TickData { + let mut ticks = TickData { + block_ticks: Vec::new(), + fluid_ticks: Vec::new(), + random_ticks: Vec::with_capacity(self.loaded_chunks.len() * 3 * 16 * 16), + block_entities: Vec::new(), + }; let mut rng = SmallRng::from_rng(&mut rand::rng()); let chunks = self @@ -563,6 +563,8 @@ impl Level { ticks.block_ticks.sort_unstable(); ticks.fluid_ticks.sort_unstable(); + + ticks } pub async fn clean_entity_chunk(self: &Arc, chunk: &Vector2) { @@ -905,12 +907,3 @@ impl Level { chunk.fluid_ticks.is_scheduled(*block_pos, fluid) } } - -impl TickData { - fn clear(&mut self) { - self.block_entities.clear(); - self.block_ticks.clear(); - self.fluid_ticks.clear(); - self.random_ticks.clear(); - } -} diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 5277a8588..ef018039f 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -678,9 +678,8 @@ impl World { } pub async fn tick_chunks(self: &Arc) { - self.level.get_tick_data().await; - let tick_data = &self.level.tick_data; - for scheduled_tick in &tick_data.lock().await.block_ticks { + let tick_data = self.level.get_tick_data().await; + for scheduled_tick in tick_data.block_ticks { let block = self.get_block(&scheduled_tick.position).await; if let Some(pumpkin_block) = self.block_registry.get_pumpkin_block(block) { pumpkin_block @@ -692,7 +691,7 @@ impl World { .await; } } - for scheduled_tick in &tick_data.lock().await.fluid_ticks { + for scheduled_tick in tick_data.fluid_ticks { let fluid = self.get_fluid(&scheduled_tick.position).await; if let Some(pumpkin_fluid) = self.block_registry.get_pumpkin_fluid(fluid) { pumpkin_fluid @@ -777,7 +776,7 @@ impl World { .unwrap_or(Duration::new(0, 0)) ); - for block_entity in &tick_data.lock().await.block_entities { + for block_entity in tick_data.block_entities { let world: Arc = self.clone(); block_entity.tick(world).await; }