Implement generic online system #82

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

10
Cargo.lock generated
View file

@ -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",

View file

@ -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"

View file

@ -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<Uuid, String>);

View file

@ -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();
}

View file

@ -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::<RequestJoin>()
.add_network_event::<AddPlayer>()
.add_network_event::<RemovePlayer>();
}
}
/// 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<AllPlayer>,
mut requests_join: EventReader<Receive<RequestJoin>>,
game_rank: Res<GameRank>,
mut add_players: EventWriter<SendTo<AddPlayer>>,
) {
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<SendTo<AddPlayer>>,
mut remove_players: EventReader<SendTo<RemovePlayer>>,
mut all_players: ResMut<AllPlayer>,
connection: Res<Connection>,
mut next_scene: ResMut<NextState<CurrentScene>>,
) {
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);
}
}

View file

@ -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,
}