feat: health component, killed cleanup, unkillable component

This commit is contained in:
Rendo 2026-05-07 12:36:29 +05:00
commit 9f490974a4
2 changed files with 65 additions and 1 deletions

0
src/health/event.rs Normal file
View file

View file

@ -1,9 +1,73 @@
use std::ops::Deref;
use bevy::prelude::*;
pub mod event;
/// Health plugin provides systems to handle health modifications and events
pub struct HealthPlugin;
impl Plugin for HealthPlugin {
fn build(&self, app: &mut App) {
//todo!()
app.add_systems(PostUpdate,cleanup_killed);
}
}
/// Component that holds health points and max health points of entity
#[derive(Component)]
pub struct Health {
health: usize,
max_health: usize,
}
impl Default for Health {
fn default() -> Self {
Self { health: 1, max_health: 1 }
}
}
impl Health {
/// Create new health component with set 'health' and 'max_health'.
pub fn new(health: usize, max_health: usize) -> Self {
Self {
health,
max_health
}
}
/// Create new health component from max health.
pub fn from_max(max_health: usize) -> Self {
Self {
health: max_health,
max_health
}
}
/// Substract 'damage' amount of health points from component with boundary check.
pub fn damage(&mut self, damage: usize) {
self.health = if damage > self.health {0} else {self.health - damage};
}
/// Add 'heal' amount of health points to component with max health as a boundary.
pub fn heal_no_overheal(&mut self, heal: usize) {
self.health = if self.health + heal > self.max_health {self.max_health} else {self.health + heal};
}
/// Add 'heal' amount of health points to component with usize::MAX as a boundary.
pub fn heal_with_overheal(&mut self, heal: usize) {
self.health = if usize::MAX-heal < self.health {usize::MAX} else {self.health + heal};
}
pub fn get_health(&self) -> usize {
self.health
}
}
/// Marker component that marks entity to NOT be despawned at the end of frame when health reaches zero
#[derive(Component)]
#[require(Health)]
pub struct Unkillable;
fn cleanup_killed(mut commands: Commands, query: Query<(Entity, &Health), Without<Unkillable>>) {
for (entity, health) in query {
if health.health == 0 {
commands.entity(entity).despawn();
}
}
}