use crate::{keys::KeySpawn, tb_entities::EnemySpawn}; use bevy::prelude::*; #[derive(Event, Reflect)] pub struct Hit { pub damage: u32, } #[derive(Component, Reflect)] struct Hp(i32); pub fn plugin(app: &mut App) { app.add_systems(Update, init); } fn init(mut commands: Commands, query: Query, Without)>) { for e in query.iter() { commands.entity(e).insert(Hp(100)).observe(on_hit); } } fn on_hit( trigger: Trigger, mut commands: Commands, mut query: Query<(&mut Hp, &Transform, &EnemySpawn)>, ) { let Hit { damage } = trigger.event(); let Ok((mut hp, transform, enemy)) = query.get_mut(trigger.entity()) else { return; }; hp.0 = hp.0.saturating_sub(*damage as i32); info!("npc hp changed: {} [{}]", hp.0, trigger.entity()); if hp.0 <= 0 { commands.entity(trigger.entity()).despawn_recursive(); if !enemy.key.is_empty() { commands.trigger(KeySpawn(transform.translation, enemy.key.clone())); } } }