mod arrow; mod gun; mod healing; mod missile; mod thrown; pub use healing::Healing; use crate::{ GameState, aim::AimTarget, character::CharacterHierarchy, global_observer, heads::ActiveHeads, heads_database::HeadsDatabase, physics_layers::GameLayer, player::{Player, PlayerBodyMesh}, sounds::PlaySound, }; use bevy::prelude::*; use healing::HealingStateChanged; use serde::{Deserialize, Serialize}; #[derive(Event, Reflect)] pub enum TriggerState { Active, Inactive, } #[derive(Event, Reflect)] pub struct TriggerCashHeal; #[derive(Debug, Copy, Clone, PartialEq, Reflect, Default, Serialize, Deserialize)] pub enum HeadAbility { #[default] None, Arrow, Thrown, Gun, Missile, Medic, } #[derive(Debug, Reflect, Clone, Copy)] pub struct TriggerData { target: Option, dir: Dir3, rot: Quat, pos: Vec3, target_layer: GameLayer, head: usize, } impl TriggerData { pub fn new( target: Option, dir: Dir3, rot: Quat, pos: Vec3, target_layer: GameLayer, head: usize, ) -> Self { Self { target, dir, rot, pos, target_layer, head, } } } #[derive(Event, Reflect)] pub struct TriggerGun(pub TriggerData); #[derive(Event, Reflect)] pub struct TriggerArrow(pub TriggerData); #[derive(Event, Reflect)] pub struct TriggerThrow(pub TriggerData); #[derive(Event, Reflect)] pub struct TriggerMissile(pub TriggerData); #[derive(Resource, Default)] pub struct TriggerStateRes { cooldown: f32, active: bool, } impl TriggerStateRes { pub fn is_active(&self) -> bool { self.active } } pub fn plugin(app: &mut App) { app.init_resource::(); app.add_plugins(gun::plugin); app.add_plugins(thrown::plugin); app.add_plugins(arrow::plugin); app.add_plugins(missile::plugin); app.add_plugins(healing::plugin); app.add_systems( Update, (update, update_heal_ability).run_if(in_state(GameState::Playing)), ); global_observer!(app, on_trigger_state); } fn on_trigger_state(trigger: Trigger, mut res: ResMut) { res.active = matches!(trigger.event(), TriggerState::Active); if !res.active { res.cooldown = 0.0; } } fn update( mut res: ResMut, mut commands: Commands, player_rot: Query<&Transform, With>, player_query: Query<(Entity, &AimTarget), With>, mut active_heads: Single<&mut ActiveHeads, With>, heads_db: Res, time: Res