Implement generic online system #82

Merged
CoCo_Sol merged 14 commits from impl-online into main 2024-03-25 05:45:17 +00:00
Showing only changes of commit 49ee6daa8e - Show all commits

View file

@ -1,12 +1,13 @@
//! All the code related to the connection . //! All the code related to the connection.
use bevnet::{Connection, NetworkAppExt, Receive, SendTo, Uuid}; use bevnet::{Connection, NetworkAppExt, Receive, SendTo, Uuid};
use bevy::prelude::*; use bevy::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::GameRank;
use crate::{AllPlayers, CurrentScene, Player}; use crate::{AllPlayers, CurrentScene, Player};
/// A plugin that handle, send or remove connections. /// A plugin that manage connections (add, remove).
pub struct ConnectionPuglin; pub struct ConnectionPuglin;
impl Plugin for ConnectionPuglin { impl Plugin for ConnectionPuglin {
@ -14,10 +15,7 @@ impl Plugin for ConnectionPuglin {
app.add_network_event::<RequestJoin>() app.add_network_event::<RequestJoin>()
.add_network_event::<AddPlayer>() .add_network_event::<AddPlayer>()
.add_network_event::<RemovePlayer>() .add_network_event::<RemovePlayer>()
.add_systems( .add_systems(Update, (accept_connection, handle_change_player));
Update,
(accept_connection, handle_change_player).run_if(in_state(CurrentScene::Lobby)),
);
} }
} }
@ -39,6 +37,7 @@ pub fn accept_connection(
mut requests_join: EventReader<Receive<RequestJoin>>, mut requests_join: EventReader<Receive<RequestJoin>>,
mut add_players: EventWriter<SendTo<AddPlayer>>, mut add_players: EventWriter<SendTo<AddPlayer>>,
connection: Res<Connection>, connection: Res<Connection>,
state: Res<State<CurrentScene>>,
) { ) {
// Check if the player is an admin // Check if the player is an admin
if all_players if all_players
@ -51,14 +50,22 @@ pub fn accept_connection(
for request_join in requests_join.read() { for request_join in requests_join.read() {
let new_uuid = request_join.0; let new_uuid = request_join.0;
let new_name = request_join.1.0.clone(); let mut new_player = request_join.1.0.clone();
add_players.send(SendTo(new_uuid, AddPlayer(new_uuid, new_name.clone()))); let current_state = *state.get();
for (uuid, name) in all_players.0.iter() { if current_state == CurrentScene::Menu {
return;
} else if current_state == CurrentScene::Game {
new_player.rank = GameRank::Spectator;
}
add_players.send(SendTo(new_uuid, AddPlayer(new_uuid, new_player.clone())));
for (uuid, player) in all_players.0.iter() {
// Link all players // Link all players
add_players.send(SendTo(*uuid, AddPlayer(new_uuid, new_name.clone()))); add_players.send(SendTo(*uuid, AddPlayer(new_uuid, new_player.clone())));
add_players.send(SendTo(new_uuid, AddPlayer(*uuid, name.clone()))); add_players.send(SendTo(new_uuid, AddPlayer(*uuid, player.clone())));
} }
} }
} }