Implement generic online system #82

Merged
CoCo_Sol merged 14 commits from impl-online into main 2024-03-25 05:45:17 +00:00
3 changed files with 14 additions and 9 deletions
Showing only changes of commit 6dd6cfc3b7 - Show all commits

View file

@ -27,7 +27,7 @@ pub enum CurrentScene {
}
/// A player in the game.
#[derive(Serialize, Deserialize, Clone)]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Player {
/// The name of the player.
pub name: String,

View file

@ -13,7 +13,11 @@ impl Plugin for ConnectionPuglin {
fn build(&self, app: &mut App) {
app.add_network_event::<RequestJoin>()
.add_network_event::<AddPlayer>()
.add_network_event::<RemovePlayer>();
.add_network_event::<RemovePlayer>()
.add_systems(
Update,
(accept_connection, handle_change_player).run_if(in_state(CurrentScene::Lobby)),
);
}
}
@ -27,7 +31,7 @@ pub struct AddPlayer(Uuid, Player);
/// An event that is trigger whene a player is removed.
#[derive(Event, Serialize, Deserialize)]
pub struct RemovePlayer(Uuid);
pub struct RemovePlayer(pub Uuid);
/// A fonction that handle join request and add it.
pub fn accept_connection(
@ -49,6 +53,8 @@ pub fn accept_connection(
let new_uuid = request_join.0;
let new_name = request_join.1.0.clone();
add_players.send(SendTo(new_uuid, AddPlayer(new_uuid, new_name.clone())));
for (uuid, name) in all_players.0.iter() {
// Link all players
add_players.send(SendTo(*uuid, AddPlayer(new_uuid, new_name.clone())));
@ -59,8 +65,8 @@ pub fn accept_connection(
/// A fonction that handle new / remove players events.
pub fn handle_change_player(
mut add_players: EventReader<SendTo<AddPlayer>>,
mut remove_players: EventReader<SendTo<RemovePlayer>>,
mut add_players: EventReader<Receive<AddPlayer>>,
mut remove_players: EventReader<Receive<RemovePlayer>>,
mut all_players: ResMut<AllPlayer>,
connection: Res<Connection>,
mut next_scene: ResMut<NextState<CurrentScene>>,

View file

@ -14,7 +14,8 @@ pub struct NetworkingPlugin;
impl Plugin for NetworkingPlugin {
fn build(&self, app: &mut App) {
app.add_plugins(ConnectionPuglin);
app.add_plugins(ConnectionPuglin)
.init_resource::<AllPlayer>();
}
}
@ -34,9 +35,7 @@ pub enum GameRank {
impl AllPlayer {
/// Get the player by a connection.
pub fn get_by_connection(&self, connection: &Connection) -> Option<&Player> {
let Some(uuid) = connection.identifier() else {
return None;
};
let uuid = connection.identifier()?;
self.0.get(&uuid)
}