save
Some checks failed
Rust Checks / checks (push) Has been cancelled

This commit is contained in:
CoCo_Sol 2024-03-18 08:24:32 +01:00
parent 3c18d2409c
commit 84cdf51420
4 changed files with 77 additions and 72 deletions

View file

@ -1,4 +1,4 @@
//! The lobby of the game. //! The admin lobby of the game.
use bevnet::{Connection, Receive, SendTo, Uuid}; use bevnet::{Connection, Receive, SendTo, Uuid};
use bevy::prelude::*; use bevy::prelude::*;
@ -8,10 +8,10 @@ use super::handle_new_players;
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection}; use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection};
use crate::CurrentScene; use crate::CurrentScene;
/// The plugin for the lobby. /// The plugin for the amdin lobby.
pub struct LobbyPlugin; pub struct AdminLobbyPlugin;
impl Plugin for LobbyPlugin { impl Plugin for AdminLobbyPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems( app.add_systems(
Update, Update,
@ -20,28 +20,26 @@ impl Plugin for LobbyPlugin {
); );
} }
} }
/// Display the UI of the lobby. /// Display the UI of the lobby.
fn lobby_ui(mut ctx: EguiContexts, connection: Res<Connection>) { fn lobby_ui(mut ctx: EguiContexts, connection: Res<Connection>) {
let Some(connection) = connection.identifier() else {
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
ui.label("Connecting...");
});
return;
};
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
ui.heading("Border Wars"); ui.heading("Border Wars");
ui.separator(); ui.separator();
ui.label("Game created");
ui.horizontal(|ui| {
ui.label("Game ID: "); ui.label("Game ID: ");
ui.text_edit_singleline( ui.text_edit_singleline(&mut connection.to_string());
&mut connection
.identifier()
.unwrap_or_else(Uuid::nil)
.to_string(),
);
});
}); });
} }
/// TODO /// Display the admin panel.
fn admin_panel( fn admin_panel(
mut ctx: EguiContexts, mut ctx: EguiContexts,
connection: Res<Connection>, connection: Res<Connection>,
@ -57,8 +55,7 @@ fn admin_panel(
ui.label("The most beautiful admin (You)"); ui.label("The most beautiful admin (You)");
continue; continue;
} }
let button = ui.button(format!("Kick {}", player.1)); if ui.button("Kick").clicked() {
if button.clicked() {
for target_player in all_players.0.iter() { for target_player in all_players.0.iter() {
event.send(SendTo(*target_player.0, RemovePlayer { uuid: *player.0 })); event.send(SendTo(*target_player.0, RemovePlayer { uuid: *player.0 }));
} }
@ -72,13 +69,20 @@ fn admin_panel(
}); });
} }
/// TODO /// Handle the request to join the game.
fn handle_request( fn handle_request(
mut events: EventReader<Receive<RequestConnection>>, mut events: EventReader<Receive<RequestConnection>>,
all_players: Res<AllPlayers>, all_players: Res<AllPlayers>,
mut new_players: EventWriter<SendTo<AddPlayer>>, mut new_players: EventWriter<SendTo<AddPlayer>>,
) { ) {
for event in events.read() { for event in events.read() {
new_players.send(SendTo(
event.0,
AddPlayer {
uuid: event.0,
name: event.1.name.clone(),
},
));
for player in all_players.0.iter() { for player in all_players.0.iter() {
let player1 = (event.0, event.1.name.clone()); let player1 = (event.0, event.1.name.clone());
let player2 = (*player.0, player.1.clone()); let player2 = (*player.0, player.1.clone());
@ -87,7 +91,7 @@ fn handle_request(
} }
} }
/// TODO /// Link two players.
fn link_two_players( fn link_two_players(
player1: (Uuid, String), player1: (Uuid, String),
player2: (Uuid, String), player2: (Uuid, String),

View file

@ -3,31 +3,31 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy_egui::{egui, EguiContexts}; use bevy_egui::{egui, EguiContexts};
use super::handle_new_players; use super::{handle_new_players, handle_remove_players};
use crate::connection::AllPlayers; use crate::connection::AllPlayers;
use crate::CurrentScene; use crate::CurrentScene;
/// The plugin for the lobby. /// The plugin for the lobby.
pub struct WaitingMenuPlugin; pub struct LobbyPlugin;
impl Plugin for WaitingMenuPlugin { impl Plugin for LobbyPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems( app.add_systems(
Update, Update,
(ui, handle_new_players).run_if(in_state(CurrentScene::Lobby)), (lobby_ui, handle_new_players, handle_remove_players)
.run_if(in_state(CurrentScene::Lobby)),
); );
} }
} }
/// TODO /// Display the UI of the lobby.
fn ui(all_players: Res<AllPlayers>, mut ctx: EguiContexts) { fn lobby_ui(all_players: Res<AllPlayers>, mut ctx: EguiContexts) {
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
ui.heading("Border Wars"); ui.heading("Border Wars");
for name in all_players.0.values() {
ui.separator(); ui.separator();
ui.label(name.to_string());
for (uuid, name) in all_players.0.iter() {
ui.label(format!("{}: {}", uuid, name));
} }
}); });
} }

View file

@ -4,7 +4,7 @@ use bevnet::{Connection, SendTo, Uuid};
use bevy::prelude::*; use bevy::prelude::*;
use bevy_egui::{egui, EguiContexts}; use bevy_egui::{egui, EguiContexts};
use crate::connection::{AllPlayers, RequestConnection}; use crate::connection::RequestConnection;
use crate::CurrentScene; use crate::CurrentScene;
/// The plugin for the menu. /// The plugin for the menu.
@ -12,30 +12,37 @@ pub struct MenuPlugin;
impl Plugin for MenuPlugin { impl Plugin for MenuPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems( app.add_systems(Update, (menu_ui).run_if(in_state(CurrentScene::Menu)));
Update,
(menu_ui, name_settings).run_if(in_state(CurrentScene::Menu)),
);
} }
} }
/// Display the UI of the menu to host a game or join one. /// Display the UI of the menu to host a game or join one.
fn menu_ui( fn menu_ui(
mut ctx: EguiContexts, mut ctx: EguiContexts,
mut connection_string: Local<String>, mut connection_string: Local<String>,
mut next_scene: ResMut<NextState<CurrentScene>>, mut next_scene: ResMut<NextState<CurrentScene>>,
all_players: Res<AllPlayers>,
connection: Res<Connection>,
mut request_join_event: EventWriter<SendTo<RequestConnection>>, mut request_join_event: EventWriter<SendTo<RequestConnection>>,
mut name: Local<String>,
connection: Res<Connection>,
) { ) {
let Some(connection_id) = connection.identifier() else { let Some(connection) = connection.identifier() else {
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
ui.label("Connecting...");
});
return; return;
}; };
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| { egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
ui.heading("Border Wars"); ui.heading("Border Wars");
ui.separator(); ui.separator();
ui.horizontal(|ui| {
ui.label("Enter your name:");
ui.text_edit_singleline(&mut *name);
});
ui.separator();
ui.label("Connect to an existing game:"); ui.label("Connect to an existing game:");
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.label("Game ID: "); ui.label("Game ID: ");
@ -49,11 +56,7 @@ fn menu_ui(
request_join_event.send(SendTo( request_join_event.send(SendTo(
target_uuid, target_uuid,
RequestConnection { RequestConnection {
name: all_players name: name.to_string(),
.0
.get(&connection_id)
.unwrap_or(&"Unknown".to_string())
.clone(),
}, },
)); ));
} }
@ -63,26 +66,13 @@ fn menu_ui(
if ui.button("Create new game").clicked() { if ui.button("Create new game").clicked() {
next_scene.set(CurrentScene::AdminLobby); next_scene.set(CurrentScene::AdminLobby);
// Add it-self to the list of players.
request_join_event.send(SendTo(
connection,
RequestConnection {
name: name.to_string(),
},
));
} }
}); });
} }
/// TODO
fn name_settings(
mut ctx: EguiContexts,
mut all_players: ResMut<AllPlayers>,
mut local_name: Local<String>,
connection: Res<Connection>,
) {
let Some(connection_id) = connection.identifier() else {
return;
};
egui::Window::new("Name settings").show(ctx.ctx_mut(), |ui| {
ui.label("Enter your name:");
ui.horizontal(|ui| {
if ui.text_edit_singleline(&mut *local_name).changed() {
all_players.0.insert(connection_id, local_name.to_string());
}
});
});
}

View file

@ -19,30 +19,41 @@ impl Plugin for ScenesPlugin {
app.add_plugins(EguiPlugin) app.add_plugins(EguiPlugin)
.add_state::<CurrentScene>() .add_state::<CurrentScene>()
.add_plugins(menu::MenuPlugin) .add_plugins(menu::MenuPlugin)
.add_plugins(admin_lobby::LobbyPlugin) .add_plugins(admin_lobby::AdminLobbyPlugin)
.add_plugins(lobby::WaitingMenuPlugin) .add_plugins(lobby::LobbyPlugin)
.add_plugins(responsive_scale::ResponsiveScalingPlugin); .add_plugins(responsive_scale::ResponsiveScalingPlugin);
} }
} }
/// TODO /// Handle the new players.
pub fn handle_new_players( pub fn handle_new_players(
mut all_players: ResMut<AllPlayers>, mut all_players: ResMut<AllPlayers>,
mut new_players: EventReader<Receive<AddPlayer>>, mut new_players: EventReader<Receive<AddPlayer>>,
mut remove_players: EventReader<Receive<RemovePlayer>>,
self_uuid: Res<Connection>,
mut next_scene: ResMut<NextState<CurrentScene>>,
) { ) {
for new_player in new_players.read() { for new_player in new_players.read() {
all_players all_players
.0 .0
.insert(new_player.1.uuid, new_player.1.name.clone()); .insert(new_player.1.uuid, new_player.1.name.clone());
} }
}
/// Handle the remove players.
pub fn handle_remove_players(
mut all_players: ResMut<AllPlayers>,
mut remove_players: EventReader<Receive<RemovePlayer>>,
connection: Res<Connection>,
mut next_scene: ResMut<NextState<CurrentScene>>,
) {
for remove_player in remove_players.read() { for remove_player in remove_players.read() {
if remove_player.1.uuid == self_uuid.identifier().unwrap_or_default() { let Some(connection) = connection.identifier() else {
return;
};
if remove_player.1.uuid == connection {
next_scene.set(CurrentScene::Menu); next_scene.set(CurrentScene::Menu);
} all_players.0.clear();
} else {
all_players.0.remove(&remove_player.1.uuid); all_players.0.remove(&remove_player.1.uuid);
} }
}
} }