generated from tipragot/rust
Implement generic online system #82
10
Cargo.lock
generated
10
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
79
crates/border-wars/src/networkinig/connection.rs
Normal file
79
crates/border-wars/src/networkinig/connection.rs
Normal 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);
|
||||
}
|
||||
}
|
30
crates/border-wars/src/networkinig/mod.rs
Normal file
30
crates/border-wars/src/networkinig/mod.rs
Normal 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,
|
||||
}
|
Loading…
Reference in a new issue