wde_terrain_grid/core/
mod.rs1use bevy::prelude::*;
2
3use crate::core::{
4 entries::PlacementPlugin,
5 grid::{Grid, GridEntityEvent}
6};
7use wde_terrain::prelude::*;
8
9pub mod entries;
10pub mod grid;
11pub mod grid_entity;
12
13pub(crate) struct CorePlugin;
14impl Plugin for CorePlugin {
15 fn build(&self, app: &mut App) {
16 app.init_resource::<Grid>()
17 .add_message::<GridEntityEvent>()
18 .add_plugins(PlacementPlugin)
19 .add_systems(Startup, set_parent)
20 .add_systems(Update, handle_grid_entity_events);
21 }
22}
23
24fn set_parent(
25 mut commands: Commands,
26 terrain: Single<Entity, With<Terrain>>,
27 mut grid: ResMut<Grid>
28) {
29 let parent = commands
30 .spawn((
31 Name::new("Terrain Entities"),
32 Transform::default(),
33 ChildOf(*terrain)
34 ))
35 .id();
36 grid.set_parent(parent);
37}
38
39fn handle_grid_entity_events(mut grid: ResMut<Grid>, mut events: MessageReader<GridEntityEvent>) {
40 for event in events.read() {
41 match event {
42 GridEntityEvent::Placed {
43 entity,
44 grid_entity
45 } => {
46 grid.set_entity(grid_entity, *entity);
47 }
48 GridEntityEvent::Removed { entity } => {
49 grid.remove_entity(*entity);
50 }
51 }
52 }
53}