From 56cff5d69e6b6eceb58f01b4ce6b0d1147754faf Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 20 Mar 2024 16:15:53 +0100 Subject: [PATCH] save --- Cargo.lock | 10 ++- crates/border-wars/Cargo.toml | 2 + crates/border-wars/src/lib.rs | 7 ++ crates/border-wars/src/main.rs | 4 + .../border-wars/src/networkinig/connection.rs | 79 +++++++++++++++++++ crates/border-wars/src/networkinig/mod.rs | 30 +++++++ 6 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 crates/border-wars/src/networkinig/connection.rs create mode 100644 crates/border-wars/src/networkinig/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 6ac8535..ee4f5e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,10 +1314,12 @@ dependencies = [ name = "border-wars" version = "0.1.0" dependencies = [ + "bevnet", "bevy", "bevy_egui", "noise", "paste", + "serde", ] [[package]] @@ -3805,18 +3807,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", diff --git a/crates/border-wars/Cargo.toml b/crates/border-wars/Cargo.toml index fc84f96..fabf283 100644 --- a/crates/border-wars/Cargo.toml +++ b/crates/border-wars/Cargo.toml @@ -15,3 +15,5 @@ bevy = "0.12.1" bevy_egui = "0.24.0" noise = "0.8.2" paste = "1.0.14" +bevnet = { path = "../bevnet" } +serde = "1.0.197" diff --git a/crates/border-wars/src/lib.rs b/crates/border-wars/src/lib.rs index 257aefb..ca0b1aa 100644 --- a/crates/border-wars/src/lib.rs +++ b/crates/border-wars/src/lib.rs @@ -1,9 +1,12 @@ //! The file that contains utility functions, enums, structs for the game. +use bevnet::Uuid; use bevy::prelude::*; +use bevy::utils::HashMap; pub mod camera; pub mod map; +pub mod networkinig; pub mod responsive_scale; pub mod scenes; @@ -20,3 +23,7 @@ pub enum CurrentScene { /// When we play this wonderful game. Game, } + +/// TODO +#[derive(Resource, Default)] +pub struct AllPlayer(pub HashMap); diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index cc2c72e..a999828 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -1,9 +1,11 @@ //! The main entry point of the game. +use bevnet::NetworkPlugin; use bevy::prelude::*; use border_wars::camera::CameraPlugin; use border_wars::map::click_tile::TilesClickable; use border_wars::map::renderer::RendererPlugin; +use border_wars::networkinig::NetworkingPlugin; use border_wars::scenes::ScenesPlugin; fn main() { @@ -13,5 +15,7 @@ fn main() { .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) .add_plugins(TilesClickable) + .add_plugins(NetworkingPlugin) + .add_plugins(NetworkPlugin::new("relay.cocosol.fr".to_string())) .run(); } diff --git a/crates/border-wars/src/networkinig/connection.rs b/crates/border-wars/src/networkinig/connection.rs new file mode 100644 index 0000000..f887099 --- /dev/null +++ b/crates/border-wars/src/networkinig/connection.rs @@ -0,0 +1,79 @@ +//! All the code related to the connection . + +use bevnet::{Connection, NetworkAppExt, Receive, SendTo, Uuid}; +use bevy::prelude::*; +use serde::{Deserialize, Serialize}; + +use super::GameRank; +use crate::{AllPlayer, CurrentScene}; + +/// A plugin that handle, send or remove connections. +pub struct ConnectionPuglin; + +impl Plugin for ConnectionPuglin { + fn build(&self, app: &mut App) { + app.add_network_event::() + .add_network_event::() + .add_network_event::(); + } +} + +/// An event that is trigger whene a new player request to join a game. +#[derive(Event, Serialize, Deserialize)] +pub struct RequestJoin(pub String); + +/// An event that is trigger whene a new player is added. +#[derive(Event, Serialize, Deserialize)] +pub struct AddPlayer(Uuid, String); + +/// An event that is trigger whene a player is removed. +#[derive(Event, Serialize, Deserialize)] +pub struct RemovePlayer(Uuid); + +/// A fonction that handle join request and add it. +pub fn accept_connection( + all_players: Res, + mut requests_join: EventReader>, + game_rank: Res, + mut add_players: EventWriter>, +) { + if *game_rank != GameRank::Admin { + return; + } + for request_join in requests_join.read() { + let new_uuid = request_join.0; + let new_name = request_join.1.0.clone(); + + for (uuid, name) in all_players.0.iter() { + // Link all players + add_players.send(SendTo(*uuid, AddPlayer(new_uuid, new_name.clone()))); + add_players.send(SendTo(new_uuid, AddPlayer(*uuid, name.clone()))); + } + } +} + +/// A fonction that handle new / remove players events. +pub fn handle_change_player( + mut add_players: EventReader>, + mut remove_players: EventReader>, + mut all_players: ResMut, + connection: Res, + mut next_scene: ResMut>, +) { + let Some(connection) = connection.identifier() else { + return; + }; + + for add_player in add_players.read() { + all_players.0.insert(add_player.1.0, add_player.1.1.clone()); + } + + for remove_player in remove_players.read() { + if remove_player.1.0 == connection { + all_players.0.clear(); + next_scene.set(CurrentScene::Menu); + return; + } + all_players.0.remove(&remove_player.1.0); + } +} diff --git a/crates/border-wars/src/networkinig/mod.rs b/crates/border-wars/src/networkinig/mod.rs new file mode 100644 index 0000000..2359d7b --- /dev/null +++ b/crates/border-wars/src/networkinig/mod.rs @@ -0,0 +1,30 @@ +//! TODO + +use bevy::prelude::*; + +use self::connection::ConnectionPuglin; + +pub mod connection; + +/// TODO +pub struct NetworkingPlugin; + +impl Plugin for NetworkingPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(ConnectionPuglin) + .insert_resource(GameRank::Player); + } +} + +/// TODO +#[derive(Resource, PartialEq, Eq)] +pub enum GameRank { + /// TODO + Spectator, + + /// TODO + Admin, + + /// TODO + Player, +}