mod arrow; mod gun; mod thrown; use crate::{ aim::AimTarget, character::ProjectileOrigin, global_observer, heads::ActiveHeads, heads_database::HeadsDatabase, physics_layers::GameLayer, player::{Player, PlayerBodyMesh}, sounds::PlaySound, }; use bevy::prelude::*; 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, } #[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); pub fn plugin(app: &mut App) { app.add_plugins(gun::plugin); app.add_plugins(thrown::plugin); app.add_plugins(arrow::plugin); global_observer!(app, on_trigger_state); } fn on_trigger_state( trigger: Trigger, mut commands: Commands, player_rot: Query<&Transform, With>, player_query: Query<(Entity, &AimTarget), With>, mut active_heads: Query<&mut ActiveHeads, With>, heads_db: Res, time: Res