rng fix
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user