From f337b78beef0e26cfe7552248a194c4fab9d6cae Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sat, 3 Aug 2024 12:40:45 -0400 Subject: [PATCH] Spawn Building --- engine/world_generation/src/hex_utils.rs | 8 ++++++ game/buildings/src/build_queue.rs | 2 ++ game/buildings/src/building_plugin.rs | 35 ++++++++++++++++++++---- game/buildings/src/buildings_map.rs | 3 +- game/main/src/phos.rs | 2 +- game/shared/src/building.rs | 20 +++++++++++++- 6 files changed, 62 insertions(+), 8 deletions(-) diff --git a/engine/world_generation/src/hex_utils.rs b/engine/world_generation/src/hex_utils.rs index c2441c4..907e2b5 100644 --- a/engine/world_generation/src/hex_utils.rs +++ b/engine/world_generation/src/hex_utils.rs @@ -1,3 +1,5 @@ +use std::fmt::Display; + use crate::prelude::Chunk; use bevy::prelude::*; use serde::{Deserialize, Serialize}; @@ -62,6 +64,12 @@ pub struct HexCoord { pub hex: IVec3, } +impl Display for HexCoord { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("HexCoord{}", self.hex)) + } +} + impl HexCoord { pub const DIRECTIONS: [IVec3; 6] = [ IVec3::new(0, 1, -1), diff --git a/game/buildings/src/build_queue.rs b/game/buildings/src/build_queue.rs index 93b8e3b..934c2ee 100644 --- a/game/buildings/src/build_queue.rs +++ b/game/buildings/src/build_queue.rs @@ -1,3 +1,5 @@ +use std::path::Display; + use bevy::prelude::Resource; use shared::building::BuildingIdentifier; use world_generation::hex_utils::HexCoord; diff --git a/game/buildings/src/building_plugin.rs b/game/buildings/src/building_plugin.rs index f9aeaff..785ce4e 100644 --- a/game/buildings/src/building_plugin.rs +++ b/game/buildings/src/building_plugin.rs @@ -3,17 +3,21 @@ use bevy_asset_loader::loading_state::{ config::{ConfigureLoadingState, LoadingStateConfig}, LoadingStateAppExt, }; -use bevy_rapier3d::{pipeline::QueryFilter, plugin::RapierContext}; +use bevy_rapier3d::{parry::transformation::utils::transform, pipeline::QueryFilter, plugin::RapierContext}; use shared::{ despawn::Despawn, states::{AssetLoadState, GameplayState}, tags::MainCamera, }; -use world_generation::{hex_utils::HexCoord, map::map::Map}; +use world_generation::{heightmap, hex_utils::HexCoord, map::map::Map}; use crate::{ - assets::{building_asset::BuildingAssetPlugin, building_database::BuildingDatabase}, + assets::{ + building_asset::{BuildingAsset, BuildingAssetPlugin}, + building_database::BuildingDatabase, + }, build_queue::{BuildQueue, QueueEntry}, + buildings_map::BuildingMap, }; pub struct BuildingPugin; @@ -21,13 +25,14 @@ pub struct BuildingPugin; impl Plugin for BuildingPugin { fn build(&self, app: &mut App) { app.insert_resource(BuildQueue::default()); + app.init_resource::(); app.add_plugins(BuildingAssetPlugin); app.configure_loading_state( LoadingStateConfig::new(AssetLoadState::Loading).load_collection::(), ); - app.add_systems(Startup, init.run_if(in_state(AssetLoadState::Loading))); + app.add_systems(Update, init.run_if(in_state(AssetLoadState::Loading))); app.add_systems(Update, hq_placement.run_if(in_state(GameplayState::PlaceHQ))); app.add_systems(PreUpdate, process_build_queue.run_if(in_state(GameplayState::Playing))); @@ -104,4 +109,24 @@ fn show_indicators(positions: Vec, commands: &mut Commands, indicator: &In } } -fn process_build_queue(mut queue: ResMut) {} +fn process_build_queue( + mut queue: ResMut, + mut commands: Commands, + db: Res, + building_assets: Res>, + heightmap: Res, +) { + for item in &queue.queue { + let handle = &db.buildings[item.building.0]; + if let Some(building) = building_assets.get(handle.id()) { + let h = heightmap.sample_height(&item.pos); + println!("Spawning {} at {}", building.name, item.pos); + commands.spawn(SceneBundle { + scene: building.prefab.clone(), + transform: Transform::from_translation(item.pos.to_world(h)), + ..Default::default() + }); + } + } + queue.queue.clear(); +} diff --git a/game/buildings/src/buildings_map.rs b/game/buildings/src/buildings_map.rs index db9f6c2..1f4a46c 100644 --- a/game/buildings/src/buildings_map.rs +++ b/game/buildings/src/buildings_map.rs @@ -1,7 +1,7 @@ use bevy::prelude::*; use world_generation::hex_utils::HexCoord; -#[derive(Resource)] +#[derive(Resource, Default)] pub struct BuildingMap { pub chunks: Vec, } @@ -33,6 +33,7 @@ impl BuildingMap { } } + pub struct BuildingChunk { pub entries: Vec, pub index: usize, diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index e230447..432f798 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -31,7 +31,7 @@ impl Plugin for PhosGamePlugin { PhosCameraPlugin, MapInitPlugin, RenderDistancePlugin, - // BuildingPugin, + BuildingPugin, DespawnPuglin, )); diff --git a/game/shared/src/building.rs b/game/shared/src/building.rs index 904f8ef..e3bdafc 100644 --- a/game/shared/src/building.rs +++ b/game/shared/src/building.rs @@ -1,10 +1,28 @@ use serde::{Deserialize, Serialize}; #[derive(Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct BuildingIdentifier(u32); +pub struct BuildingIdentifier(pub usize); + +impl From for BuildingIdentifier { + fn from(value: i32) -> Self { + return BuildingIdentifier(value as usize); + } +} impl From for BuildingIdentifier { fn from(value: u32) -> Self { + return BuildingIdentifier(value as usize); + } +} + +impl From for BuildingIdentifier { + fn from(value: usize) -> Self { return BuildingIdentifier(value); } } + +impl Into for BuildingIdentifier { + fn into(self) -> usize { + return self.0; + } +}