This commit is contained in:
2026-03-22 01:00:42 +00:00
parent 71653350d8
commit deb3f741b0
+11 -7
View File
@@ -16,12 +16,13 @@ use crate::entities::tasks::idle::execute_idle;
use crate::world::tiles::tilemap::TileMap; use crate::world::tiles::tilemap::TileMap;
use bevy::prelude::*; use bevy::prelude::*;
use bevy_rand::prelude::*; use bevy_rand::prelude::*;
use rand::{RngExt, SeedableRng};
/// Main task executor. Runs in FixedUpdate. /// Main task executor. Runs in FixedUpdate.
pub fn task_executor_system( pub fn task_executor_system(
mut commands: Commands, mut commands: Commands,
tilemap: Res<TileMap>, tilemap: Res<TileMap>,
mut rng_q: Query<&mut WyRand, With<GlobalRng>>, time: Res<Time>,
mut query: Query<( mut query: Query<(
Entity, Entity,
&mut TaskQueue, &mut TaskQueue,
@@ -33,12 +34,15 @@ pub fn task_executor_system(
mut completed_writer: MessageWriter<TaskCompleted>, mut completed_writer: MessageWriter<TaskCompleted>,
mut failed_writer: MessageWriter<TaskFailed>, mut failed_writer: MessageWriter<TaskFailed>,
) { ) {
// Get mutable access to the single GlobalRng entity // Create a deterministic RNG from global SEED + time
// This must be done once per frame, not per entity // This mirrors the forestry.rs pattern - no dependency on bevy_rand plugin
let mut rng = match rng_q.single_mut() { use std::collections::hash_map::DefaultHasher;
Ok(r) => r, use std::hash::{Hash, Hasher};
Err(_) => return, // No GlobalRng entity exists yet let mut hasher = DefaultHasher::new();
}; crate::constants::SEED.hash(&mut hasher);
time.elapsed_secs().to_bits().hash(&mut hasher);
let seed = hasher.finish();
let mut rng = WyRand::seed_from_u64(seed);
for (entity, mut queue, mut state, mut ambulatory, transform) in query.iter_mut() { for (entity, mut queue, mut state, mut ambulatory, transform) in query.iter_mut() {
// If queue empty, assign default Idle task // If queue empty, assign default Idle task