generated from tipragot/rust
Implement generic online system #82
|
@ -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())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue