1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
use bevy::prelude::*;
use crate::{
components::DirworldEntity,
events::{DirworldNavigationComplete, DirworldSpawn},
resources::{DirworldObservers, DirworldTasks, EntryType},
Extensions,
};
use super::{
DirworldPreloadBegin, PreloadPaths, PreloadState, RoomAssets,
};
pub fn cache_preload_paths(
mut event_reader: EventReader<DirworldPreloadBegin>,
mut paths: ResMut<PreloadPaths>,
) {
for DirworldPreloadBegin { old_path, path } in event_reader.read() {
paths.src = old_path.canonicalize().unwrap();
paths.dst = path.canonicalize().unwrap();
}
}
pub fn handle_preload(
asset_server: Res<AssetServer>,
room_assets: Res<RoomAssets>,
mut next_state: ResMut<NextState<PreloadState>>,
mut dirworld_tasks: ResMut<DirworldTasks>,
) {
if room_assets.is_empty()
|| room_assets
.values()
.flat_map(|v| v.values())
.all(|a| asset_server.is_loaded_with_dependencies(a))
{
info!("Preload Done.");
next_state.set(PreloadState::Done);
dirworld_tasks.remove("Loading Room");
}
}
pub fn handle_spawn(
preload_paths: Res<PreloadPaths>,
dirworld_entity_query: Query<(Entity, &DirworldEntity)>,
mut commands: Commands,
observers: Res<DirworldObservers>,
mut event_writer: EventWriter<DirworldNavigationComplete>,
) {
info!("Spawning");
for (entity, DirworldEntity { path, .. }) in dirworld_entity_query.iter() {
let entry_type = if path.is_dir() {
EntryType::Folder
} else {
EntryType::File(path.extensions())
};
if let Some(observer) = observers.get(&entry_type) {
info!("Found observer {observer:?} for {entry_type:?}");
commands.trigger_targets(DirworldSpawn(entity), observer.clone());
}
}
event_writer.send(DirworldNavigationComplete {
from: preload_paths.src.clone(),
to: preload_paths.dst.clone(),
});
}
|