#[cfg(feature = "client")] use crate::{ backpack::backpack_ui::BackpackUiState, control::BackpackButtonPress, player::LocalPlayer, protocol::PlaySound, }; use crate::{ cash::CashCollectEvent, global_observer, head_drop::HeadCollected, heads::HeadState, heads_database::HeadsDatabase, }; use bevy::prelude::*; #[cfg(feature = "client")] use bevy_replicon::prelude::ClientTriggerExt; use serde::{Deserialize, Serialize}; pub use ui_head_state::UiHeadState; pub mod backpack_ui; pub mod ui_head_state; #[derive(Component, Default, Reflect, Serialize, Deserialize, PartialEq)] #[reflect(Component)] pub struct Backpack { pub heads: Vec, } 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, Serialize, Deserialize)] pub struct BackpackSwapEvent(pub usize); pub fn plugin(app: &mut App) { app.register_type::(); app.add_plugins(backpack_ui::plugin); #[cfg(feature = "client")] app.add_systems(FixedUpdate, (backpack_inputs, sync_on_change)); global_observer!(app, on_head_collect); } #[cfg(feature = "client")] #[allow(clippy::too_many_arguments)] fn backpack_inputs( backpacks: Single<(&Backpack, &mut BackpackUiState), With>, mut backpack_inputs: MessageReader, mut commands: Commands, time: Res