generated from tipragot/rust
Implement generic online system #82
|
@ -27,7 +27,7 @@ pub enum CurrentScene {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A player in the game.
|
/// A player in the game.
|
||||||
#[derive(Serialize, Deserialize, Clone)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct Player {
|
pub struct Player {
|
||||||
/// The name of the player.
|
/// The name of the player.
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
|
|
@ -13,7 +13,11 @@ impl Plugin for ConnectionPuglin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
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(
|
||||||
|
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.
|
/// An event that is trigger whene a player is removed.
|
||||||
#[derive(Event, Serialize, Deserialize)]
|
#[derive(Event, Serialize, Deserialize)]
|
||||||
pub struct RemovePlayer(Uuid);
|
pub struct RemovePlayer(pub Uuid);
|
||||||
|
|
||||||
/// A fonction that handle join request and add it.
|
/// A fonction that handle join request and add it.
|
||||||
pub fn accept_connection(
|
pub fn accept_connection(
|
||||||
|
@ -49,6 +53,8 @@ pub fn accept_connection(
|
||||||
let new_uuid = request_join.0;
|
let new_uuid = request_join.0;
|
||||||
let new_name = request_join.1.0.clone();
|
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() {
|
for (uuid, name) 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_name.clone())));
|
||||||
|
@ -59,8 +65,8 @@ pub fn accept_connection(
|
||||||
|
|
||||||
/// A fonction that handle new / remove players events.
|
/// A fonction that handle new / remove players events.
|
||||||
pub fn handle_change_player(
|
pub fn handle_change_player(
|
||||||
mut add_players: EventReader<SendTo<AddPlayer>>,
|
mut add_players: EventReader<Receive<AddPlayer>>,
|
||||||
mut remove_players: EventReader<SendTo<RemovePlayer>>,
|
mut remove_players: EventReader<Receive<RemovePlayer>>,
|
||||||
mut all_players: ResMut<AllPlayer>,
|
mut all_players: ResMut<AllPlayer>,
|
||||||
connection: Res<Connection>,
|
connection: Res<Connection>,
|
||||||
mut next_scene: ResMut<NextState<CurrentScene>>,
|
mut next_scene: ResMut<NextState<CurrentScene>>,
|
||||||
|
|
|
@ -14,7 +14,8 @@ pub struct NetworkingPlugin;
|
||||||
|
|
||||||
impl Plugin for NetworkingPlugin {
|
impl Plugin for NetworkingPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
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 {
|
impl AllPlayer {
|
||||||
/// Get the player by a connection.
|
/// Get the player by a connection.
|
||||||
pub fn get_by_connection(&self, connection: &Connection) -> Option<&Player> {
|
pub fn get_by_connection(&self, connection: &Connection) -> Option<&Player> {
|
||||||
let Some(uuid) = connection.identifier() else {
|
let uuid = connection.identifier()?;
|
||||||
return None;
|
|
||||||
};
|
|
||||||
|
|
||||||
self.0.get(&uuid)
|
self.0.get(&uuid)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue