Files
HEDZReloaded/crates/hedz_reloaded/src/cash.rs
extrawurst 7cfae285ed Crate unification (#88)
* move client/server/config into shared

* move platforms into shared

* move head drops into shared

* move tb_entities to shared

* reduce server to just a call into shared

* get solo play working

* fix server opening window

* fix fmt

* extracted a few more modules from client

* near completely migrated client

* fixed duplicate CharacterInputEnabled definition

* simplify a few things related to builds

* more simplifications

* fix warnings/check

* ci update

* address comments

* try fixing macos steam build

* address comments

* address comments

* CI tweaks with default client feature

---------

Co-authored-by: PROMETHIA-27 <electriccobras@gmail.com>
2025-12-18 12:31:22 -05:00

92 lines
2.2 KiB
Rust

use crate::{
GameState, HEDZ_GREEN, global_observer, loading_assets::UIAssets, protocol::PlaySound,
server_observer,
};
use avian3d::prelude::Rotation;
use bevy::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Component, Reflect, Default)]
#[reflect(Component)]
#[require(Transform)]
pub struct Cash;
#[derive(Component, Reflect, Default)]
#[reflect(Component)]
struct CashText;
#[derive(Component, Reflect, Default, Serialize, Deserialize, PartialEq)]
pub struct CashInventory {
pub cash: i32,
}
#[derive(Event)]
pub struct CashCollectEvent;
pub fn plugin(app: &mut App) {
app.add_systems(OnEnter(GameState::Playing), setup);
app.add_systems(
Update,
(rotate, update_ui).run_if(in_state(GameState::Playing)),
);
server_observer!(app, on_cash_collect);
}
fn on_cash_collect(
_trigger: On<CashCollectEvent>,
mut commands: Commands,
mut cash: Single<&mut CashInventory>,
) {
use bevy_replicon::prelude::{SendMode, ServerTriggerExt, ToClients};
commands.server_trigger(ToClients {
mode: SendMode::Broadcast,
message: PlaySound::CashCollect,
});
cash.cash += 100;
}
fn rotate(time: Res<Time>, mut query: Query<&mut Rotation, With<Cash>>) {
for mut rotation in query.iter_mut() {
rotation.0 = rotation
.0
.mul_quat(Quat::from_rotation_y(time.delta_secs()));
}
}
fn update_ui(
cash: Single<&CashInventory, Changed<CashInventory>>,
text: Query<Entity, With<CashText>>,
mut writer: TextUiWriter,
) {
let Some(text) = text.iter().next() else {
return;
};
*writer.text(text, 0) = cash.cash.to_string();
}
fn setup(mut commands: Commands, assets: Res<UIAssets>) {
commands.spawn((
Name::new("cash-ui"),
Text::new("0"),
TextShadow::default(),
CashText,
TextFont {
font: assets.font.clone(),
font_size: 34.0,
..default()
},
TextColor(HEDZ_GREEN.into()),
TextLayout::new_with_justify(Justify::Center),
Node {
position_type: PositionType::Absolute,
bottom: Val::Px(40.0),
left: Val::Px(100.0),
..default()
},
));
}