Compare commits

..

2 commits

Author SHA1 Message Date
CoCo_Sol b0d743f1b6 save
All checks were successful
Rust Checks / checks (push) Successful in 2m30s
Rust Checks / checks (pull_request) Successful in 2m22s
2024-04-07 18:54:39 +02:00
CoCo_Sol 6dfde67300 Add resources system and update player struct
All checks were successful
Rust Checks / checks (push) Successful in 3m9s
2024-04-07 17:34:28 +02:00
3 changed files with 56 additions and 3 deletions

View file

@ -43,4 +43,7 @@ pub struct Player {
/// The color of the player. /// The color of the player.
pub color: (u8, u8, u8), pub color: (u8, u8, u8),
/// The resources of the player.
pub resources: resources::Resources,
} }

View file

@ -1,6 +1,10 @@
//! All program related to the resources of the game. //! All program related to the resources of the game.
use bevnet::{NetworkAppExt, Receive, SendTo};
use bevy::prelude::*; use bevy::prelude::*;
use serde::{Deserialize, Serialize};
use crate::Player;
/// The plugin that manage the resources. /// The plugin that manage the resources.
pub struct ResourcesPlugin; pub struct ResourcesPlugin;
@ -9,12 +13,16 @@ impl Plugin for ResourcesPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_event::<ResetResources>() app.add_event::<ResetResources>()
.insert_resource(Resources::initial()) .insert_resource(Resources::initial())
.add_systems(Update, handle_reset_resources); .add_network_event::<UpdateResources>()
.add_systems(
Update,
(handle_reset_resources, save_resources, update_resources),
);
} }
} }
/// The resources of the game. /// The resources of the game.
#[derive(Resource, Default)] #[derive(Resource, Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Resources { pub struct Resources {
/// The stone resource. /// The stone resource.
pub stone: u32, pub stone: u32,
@ -28,7 +36,7 @@ pub struct Resources {
impl Resources { impl Resources {
/// Returns the initial resources of the game. /// Returns the initial resources of the game.
const fn initial() -> Self { pub const fn initial() -> Self {
Self { Self {
stone: 100, stone: 100,
wood: 100, wood: 100,
@ -50,3 +58,42 @@ fn handle_reset_resources(
*resources = Resources::initial(); *resources = Resources::initial();
} }
} }
/// An event send to update the resources of a player.
#[derive(Event, Serialize, Deserialize, Clone, Copy)]
pub struct UpdateResources(pub Resources);
/// Save the resources of the game when you modify it.
fn save_resources(
mut update_resources_event: EventWriter<SendTo<UpdateResources>>,
resources: Res<Resources>,
players: Query<&Player>,
) {
if !resources.is_changed() {
return;
}
let event = UpdateResources(*resources);
for player in players.iter() {
update_resources_event.send(SendTo(player.uuid, event));
}
}
/// Update the resources of all player.
fn update_resources(
mut update_resources_event: EventReader<Receive<UpdateResources>>,
mut players: Query<&mut Player>,
) {
for event in update_resources_event.read() {
let Some(mut player) = players.iter_mut().find(|player| player.uuid == event.0) else {
continue;
};
player.resources = event.1.0;
println!(
"Update resources for player {:?} to {:?}",
player.uuid, player.resources
);
}
}

View file

@ -6,6 +6,7 @@ use bevy_egui::{egui, EguiContexts};
use crate::networking::connection::RequestJoin; use crate::networking::connection::RequestJoin;
use crate::networking::PlayerRank; use crate::networking::PlayerRank;
use crate::resources::Resources;
use crate::{CurrentScene, Player}; use crate::{CurrentScene, Player};
/// The plugin for the menu. /// The plugin for the menu.
@ -59,6 +60,7 @@ fn menu_ui(
rank: PlayerRank::Player, rank: PlayerRank::Player,
uuid, uuid,
color: rand::random::<(u8, u8, u8)>(), color: rand::random::<(u8, u8, u8)>(),
resources: Resources::initial(),
}), }),
)); ));
} }
@ -73,6 +75,7 @@ fn menu_ui(
rank: PlayerRank::Admin, rank: PlayerRank::Admin,
uuid, uuid,
color: rand::random::<(u8, u8, u8)>(), color: rand::random::<(u8, u8, u8)>(),
resources: Resources::initial(),
}); });
} }
}); });