Files
HEDZReloaded/crates/shared/src/backpack/mod.rs
2025-08-25 11:41:28 +04:00

67 lines
1.5 KiB
Rust

mod backpack_ui;
mod ui_head_state;
use crate::{
cash::CashCollectEvent, global_observer, head_drop::HeadCollected, heads::HeadState,
heads_database::HeadsDatabase,
};
use bevy::prelude::*;
use serde::{Deserialize, Serialize};
pub use ui_head_state::UiHeadState;
#[derive(Component, Default, Reflect, Serialize, Deserialize, PartialEq)]
#[reflect(Component)]
pub struct Backpack {
pub heads: Vec<HeadState>,
}
impl Backpack {
pub fn reloading(&self) -> bool {
for head in &self.heads {
if !head.has_ammo() {
return true;
}
}
false
}
pub fn contains(&self, head_id: usize) -> bool {
self.heads.iter().any(|head| head.head == head_id)
}
pub fn insert(&mut self, head_id: usize, heads_db: &HeadsDatabase) {
self.heads.push(HeadState::new(head_id, heads_db));
}
}
#[derive(Event)]
pub struct BackbackSwapEvent(pub usize);
pub fn plugin(app: &mut App) {
app.register_type::<Backpack>();
app.add_plugins(backpack_ui::plugin);
global_observer!(app, on_head_collect);
}
fn on_head_collect(
trigger: Trigger<HeadCollected>,
mut cmds: Commands,
mut backpack: Query<&mut Backpack>,
heads_db: Res<HeadsDatabase>,
) -> Result {
let HeadCollected(head) = *trigger.event();
let mut backpack = backpack.get_mut(trigger.target())?;
if backpack.contains(head) {
cmds.trigger(CashCollectEvent);
} else {
backpack.insert(head, heads_db.as_ref());
}
Ok(())
}