From 4652bc456351c39e7ced30b6cd12563c3c8aec9a Mon Sep 17 00:00:00 2001 From: extrawurst Date: Wed, 2 Apr 2025 11:33:01 +0800 Subject: [PATCH] player can take damage --- src/abilities/mod.rs | 2 +- src/abilities/thrown.rs | 2 +- src/aim/target_ui.rs | 7 ++--- src/heads/mod.rs | 39 ++++++++++++++++++++++++-- src/hitpoints.rs | 61 +++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ src/npc.rs | 55 ++++++++++--------------------------- src/player.rs | 2 ++ 8 files changed, 120 insertions(+), 50 deletions(-) create mode 100644 src/hitpoints.rs diff --git a/src/abilities/mod.rs b/src/abilities/mod.rs index d5a6dc9..82afbfc 100644 --- a/src/abilities/mod.rs +++ b/src/abilities/mod.rs @@ -4,7 +4,7 @@ mod thrown; use crate::{ GameState, heads::ActiveHeads, - npc::Hit, + hitpoints::Hit, player::{Player, PlayerRig}, sounds::PlaySound, tb_entities::EnemySpawn, diff --git a/src/abilities/thrown.rs b/src/abilities/thrown.rs index 7961aaa..93fbe3a 100644 --- a/src/abilities/thrown.rs +++ b/src/abilities/thrown.rs @@ -3,8 +3,8 @@ use crate::{ GameState, aim::AimState, billboards::Billboard, + hitpoints::Hit, loading_assets::GameAssets, - npc::Hit, physics_layers::GameLayer, player::{Player, PlayerRig}, sounds::PlaySound, diff --git a/src/aim/target_ui.rs b/src/aim/target_ui.rs index c286fe9..1d70483 100644 --- a/src/aim/target_ui.rs +++ b/src/aim/target_ui.rs @@ -1,10 +1,7 @@ use super::AimState; use crate::{ - GameState, - backpack::UiHeadState, - heads::HeadsImages, - loading_assets::UIAssets, - npc::{Hitpoints, NpcHead}, + GameState, backpack::UiHeadState, heads::HeadsImages, hitpoints::Hitpoints, + loading_assets::UIAssets, npc::NpcHead, }; use bevy::prelude::*; diff --git a/src/heads/mod.rs b/src/heads/mod.rs index adf08b2..6eab18e 100644 --- a/src/heads/mod.rs +++ b/src/heads/mod.rs @@ -4,7 +4,8 @@ use crate::{ GameState, abilities::HeadAbility, backpack::{BackbackSwapEvent, Backpack}, - player::head_id_to_str, + hitpoints::Hitpoints, + player::{Player, head_id_to_str}, sounds::PlaySound, }; use bevy::prelude::*; @@ -92,6 +93,15 @@ impl ActiveHeads { false } + + pub fn set_hitpoint(&mut self, hp: &Hitpoints) { + let Some(head) = &mut self.heads[self.current_slot] else { + error!("cannot use ammo of empty head"); + return; + }; + + (head.health, head.health_max) = hp.get() + } } #[derive(Event, Reflect)] @@ -118,7 +128,10 @@ pub fn plugin(app: &mut App) { }); app.add_systems(OnEnter(GameState::Playing), setup); - app.add_systems(Update, reload.run_if(in_state(GameState::Playing))); + app.add_systems( + Update, + (reload, sync_hp).run_if(in_state(GameState::Playing)), + ); app.add_observer(on_select_active_head); app.add_observer(on_swap_backpack); @@ -133,6 +146,14 @@ fn setup(mut commands: Commands, asset_server: Res) { commands.insert_resource(HeadsImages { heads }); } +fn sync_hp(mut active: ResMut, query: Query<&Hitpoints, With>) { + let Ok(hp) = query.get_single() else { + return; + }; + + active.set_hitpoint(hp); +} + fn reload(mut commands: Commands, mut active: ResMut, time: Res