generated from tipragot/rust
parent
3c18d2409c
commit
84cdf51420
|
@ -1,4 +1,4 @@
|
|||
//! The lobby of the game.
|
||||
//! The admin lobby of the game.
|
||||
|
||||
use bevnet::{Connection, Receive, SendTo, Uuid};
|
||||
use bevy::prelude::*;
|
||||
|
@ -8,10 +8,10 @@ use super::handle_new_players;
|
|||
use crate::connection::{AddPlayer, AllPlayers, RemovePlayer, RequestConnection};
|
||||
use crate::CurrentScene;
|
||||
|
||||
/// The plugin for the lobby.
|
||||
pub struct LobbyPlugin;
|
||||
/// The plugin for the amdin lobby.
|
||||
pub struct AdminLobbyPlugin;
|
||||
|
||||
impl Plugin for LobbyPlugin {
|
||||
impl Plugin for AdminLobbyPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(
|
||||
Update,
|
||||
|
@ -20,28 +20,26 @@ impl Plugin for LobbyPlugin {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Display the UI of the lobby.
|
||||
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| {
|
||||
ui.heading("Border Wars");
|
||||
|
||||
ui.separator();
|
||||
|
||||
ui.label("Game created");
|
||||
ui.horizontal(|ui| {
|
||||
ui.label("Game ID: ");
|
||||
ui.text_edit_singleline(
|
||||
&mut connection
|
||||
.identifier()
|
||||
.unwrap_or_else(Uuid::nil)
|
||||
.to_string(),
|
||||
);
|
||||
});
|
||||
ui.text_edit_singleline(&mut connection.to_string());
|
||||
});
|
||||
}
|
||||
|
||||
/// TODO
|
||||
/// Display the admin panel.
|
||||
fn admin_panel(
|
||||
mut ctx: EguiContexts,
|
||||
connection: Res<Connection>,
|
||||
|
@ -57,8 +55,7 @@ fn admin_panel(
|
|||
ui.label("The most beautiful admin (You)");
|
||||
continue;
|
||||
}
|
||||
let button = ui.button(format!("Kick {}", player.1));
|
||||
if button.clicked() {
|
||||
if ui.button("Kick").clicked() {
|
||||
for target_player in all_players.0.iter() {
|
||||
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(
|
||||
mut events: EventReader<Receive<RequestConnection>>,
|
||||
all_players: Res<AllPlayers>,
|
||||
mut new_players: EventWriter<SendTo<AddPlayer>>,
|
||||
) {
|
||||
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() {
|
||||
let player1 = (event.0, event.1.name.clone());
|
||||
let player2 = (*player.0, player.1.clone());
|
||||
|
@ -87,7 +91,7 @@ fn handle_request(
|
|||
}
|
||||
}
|
||||
|
||||
/// TODO
|
||||
/// Link two players.
|
||||
fn link_two_players(
|
||||
player1: (Uuid, String),
|
||||
player2: (Uuid, String),
|
||||
|
|
|
@ -3,31 +3,31 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy_egui::{egui, EguiContexts};
|
||||
|
||||
use super::handle_new_players;
|
||||
use super::{handle_new_players, handle_remove_players};
|
||||
use crate::connection::AllPlayers;
|
||||
use crate::CurrentScene;
|
||||
|
||||
/// 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) {
|
||||
app.add_systems(
|
||||
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
|
||||
fn ui(all_players: Res<AllPlayers>, mut ctx: EguiContexts) {
|
||||
/// Display the UI of the lobby.
|
||||
fn lobby_ui(all_players: Res<AllPlayers>, mut ctx: EguiContexts) {
|
||||
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
||||
ui.heading("Border Wars");
|
||||
|
||||
for name in all_players.0.values() {
|
||||
ui.separator();
|
||||
|
||||
for (uuid, name) in all_players.0.iter() {
|
||||
ui.label(format!("{}: {}", uuid, name));
|
||||
ui.label(name.to_string());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ use bevnet::{Connection, SendTo, Uuid};
|
|||
use bevy::prelude::*;
|
||||
use bevy_egui::{egui, EguiContexts};
|
||||
|
||||
use crate::connection::{AllPlayers, RequestConnection};
|
||||
use crate::connection::RequestConnection;
|
||||
use crate::CurrentScene;
|
||||
|
||||
/// The plugin for the menu.
|
||||
|
@ -12,30 +12,37 @@ pub struct MenuPlugin;
|
|||
|
||||
impl Plugin for MenuPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(
|
||||
Update,
|
||||
(menu_ui, name_settings).run_if(in_state(CurrentScene::Menu)),
|
||||
);
|
||||
app.add_systems(Update, (menu_ui).run_if(in_state(CurrentScene::Menu)));
|
||||
}
|
||||
}
|
||||
|
||||
/// Display the UI of the menu to host a game or join one.
|
||||
fn menu_ui(
|
||||
mut ctx: EguiContexts,
|
||||
mut connection_string: Local<String>,
|
||||
mut next_scene: ResMut<NextState<CurrentScene>>,
|
||||
all_players: Res<AllPlayers>,
|
||||
connection: Res<Connection>,
|
||||
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;
|
||||
};
|
||||
|
||||
egui::CentralPanel::default().show(ctx.ctx_mut(), |ui| {
|
||||
ui.heading("Border Wars");
|
||||
|
||||
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.horizontal(|ui| {
|
||||
ui.label("Game ID: ");
|
||||
|
@ -49,11 +56,7 @@ fn menu_ui(
|
|||
request_join_event.send(SendTo(
|
||||
target_uuid,
|
||||
RequestConnection {
|
||||
name: all_players
|
||||
.0
|
||||
.get(&connection_id)
|
||||
.unwrap_or(&"Unknown".to_string())
|
||||
.clone(),
|
||||
name: name.to_string(),
|
||||
},
|
||||
));
|
||||
}
|
||||
|
@ -63,26 +66,13 @@ fn menu_ui(
|
|||
|
||||
if ui.button("Create new game").clicked() {
|
||||
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());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -19,30 +19,41 @@ impl Plugin for ScenesPlugin {
|
|||
app.add_plugins(EguiPlugin)
|
||||
.add_state::<CurrentScene>()
|
||||
.add_plugins(menu::MenuPlugin)
|
||||
.add_plugins(admin_lobby::LobbyPlugin)
|
||||
.add_plugins(lobby::WaitingMenuPlugin)
|
||||
.add_plugins(admin_lobby::AdminLobbyPlugin)
|
||||
.add_plugins(lobby::LobbyPlugin)
|
||||
.add_plugins(responsive_scale::ResponsiveScalingPlugin);
|
||||
}
|
||||
}
|
||||
|
||||
/// TODO
|
||||
/// Handle the new players.
|
||||
pub fn handle_new_players(
|
||||
mut all_players: ResMut<AllPlayers>,
|
||||
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() {
|
||||
all_players
|
||||
.0
|
||||
.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() {
|
||||
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);
|
||||
}
|
||||
all_players.0.clear();
|
||||
} else {
|
||||
all_players.0.remove(&remove_player.1.uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue