From c016d23a02f2c0184ee18a92cacb8dff0e223279 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Sat, 8 Jan 2022 00:30:19 +0100 Subject: [PATCH 01/11] Initial commit added system for adding or changing tablist headers and footers. To make the tablist prettier --- feather/common/src/events.rs | 6 ++++++ feather/server/src/client.rs | 7 ++++++- feather/server/src/systems/tablist.rs | 18 ++++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index 2426c2896..384cd64ae 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -73,3 +73,9 @@ pub struct EntityRemoveEvent; /// Triggered when an entity is added into the world. #[derive(Debug)] pub struct EntityCreateEvent; + +#[derive(Debug)] +pub struct TablistExtrasUpdateEvent { + pub header: Option, + pub footer: Option, +} \ No newline at end of file diff --git a/feather/server/src/client.rs b/feather/server/src/client.rs index 20211f39b..07e8fea96 100644 --- a/feather/server/src/client.rs +++ b/feather/server/src/client.rs @@ -18,7 +18,7 @@ use common::{ Window, }; use libcraft_items::InventorySlot; -use packets::server::{Particle, SetSlot, SpawnLivingEntity, UpdateLight, WindowConfirmation}; +use packets::server::{Particle, SetSlot, SpawnLivingEntity, UpdateLight, WindowConfirmation, PlayerListHeaderAndFooter}; use protocol::packets::server::{ EntityPosition, EntityPositionAndRotation, EntityTeleport, HeldItemChange, PlayerAbilities, }; @@ -331,6 +331,11 @@ impl Client { self.send_packet(PlayerInfo::RemovePlayers(vec![uuid])); } + pub fn send_tablist_header_footer(&self, header: &str, footer: &str) { + log::trace!("Sending PlayerListHeaderAndFooter ({},{})", header, footer); + self.send_packet(PlayerListHeaderAndFooter {header: header.to_string(), footer: footer.to_string()}) + } + pub fn unload_entity(&self, id: NetworkId) { log::trace!("Unloading {:?} on {}", id, self.username); self.sent_entities.borrow_mut().remove(&id); diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index 2f38b6aa9..81e6478cb 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -2,7 +2,7 @@ use base::{Gamemode, ProfileProperty}; use common::{ - events::{EntityRemoveEvent, PlayerJoinEvent}, + events::{EntityRemoveEvent, PlayerJoinEvent, TablistExtrasUpdateEvent}, Game, }; use ecs::{SysResult, SystemExecutor}; @@ -15,7 +15,8 @@ pub fn register(systems: &mut SystemExecutor) { systems .group::() .add_system(remove_tablist_players) - .add_system(add_tablist_players); + .add_system(add_tablist_players) + .add_system(update_tablist_header); } fn remove_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { @@ -62,3 +63,16 @@ fn add_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { } Ok(()) } + +fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { + game.ecs.insert_event(TablistExtrasUpdateEvent{ header: Some("{\"text\":\"xDDDDD\"}".to_string()), footer: Some("{\"text\":\"xDDDDDDD\"}".to_string()) }); + let default = "{\"text\":\"\"}"; + for (_,event) in game + .ecs + .query::<&TablistExtrasUpdateEvent>() + .iter() + { + server.broadcast_with(|client| client.send_tablist_header_footer(event.header.as_deref().unwrap_or(default), event.footer.as_deref().unwrap_or(default))) + } + Ok(()) +} From 35babb7718b7610b4e32379d1a526d3a6e04f326 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Sat, 8 Jan 2022 21:50:19 +0100 Subject: [PATCH 02/11] Send extra info to new players Tablist header and footer now in TablistHeaderFooter type Resources now used to store TablistHeaderFooter --- feather/common/src/events.rs | 11 +++++++---- feather/server/src/systems.rs | 2 +- feather/server/src/systems/tablist.rs | 26 +++++++++++++++++++------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index 384cd64ae..75254dd2e 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -74,8 +74,11 @@ pub struct EntityRemoveEvent; #[derive(Debug)] pub struct EntityCreateEvent; +#[derive(Debug, Clone)] +pub struct TablistHeaderFooter { + pub header: String, + pub footer: String, +} + #[derive(Debug)] -pub struct TablistExtrasUpdateEvent { - pub header: Option, - pub footer: Option, -} \ No newline at end of file +pub struct TablistExtrasUpdateEvent; \ No newline at end of file diff --git a/feather/server/src/systems.rs b/feather/server/src/systems.rs index ee7e85b37..b7ddb79ce 100644 --- a/feather/server/src/systems.rs +++ b/feather/server/src/systems.rs @@ -30,7 +30,7 @@ pub fn register(server: Server, game: &mut Game, systems: &mut SystemExecutor) { +pub fn register(game: &mut Game,systems: &mut SystemExecutor) { + game.insert_resource(TablistHeaderFooter { header: "{\"text\":\"\"}".to_string(), footer: "{\"text\":\"\"}".to_string() }); systems .group::() .add_system(remove_tablist_players) .add_system(add_tablist_players) - .add_system(update_tablist_header); + .add_system(update_tablist_header) + .add_system(send_tablist_header_on_join); } fn remove_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { @@ -65,14 +67,24 @@ fn add_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { } fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { - game.ecs.insert_event(TablistExtrasUpdateEvent{ header: Some("{\"text\":\"xDDDDD\"}".to_string()), footer: Some("{\"text\":\"xDDDDDDD\"}".to_string()) }); - let default = "{\"text\":\"\"}"; - for (_,event) in game + for _ in game .ecs .query::<&TablistExtrasUpdateEvent>() .iter() { - server.broadcast_with(|client| client.send_tablist_header_footer(event.header.as_deref().unwrap_or(default), event.footer.as_deref().unwrap_or(default))) + let header_footer = game.resources.get::()?; + server.broadcast_with(|client| client.send_tablist_header_footer(&header_footer.header, &header_footer.footer)); + } + Ok(()) +} + +fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResult { + for (_, (_, &client_id)) in game + .ecs + .query::<(&PlayerJoinEvent, &ClientId)>() + .iter(){ + let header_footer = game.resources.get::()?; + server.clients.get(client_id).unwrap().send_tablist_header_footer(&header_footer.header, &header_footer.footer); } Ok(()) } From a8fbd384d4e5b2eb23033782ef4e303275da7479 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Sat, 8 Jan 2022 22:15:56 +0100 Subject: [PATCH 03/11] Cargo fmt --- feather/common/src/events.rs | 2 +- feather/server/src/client.rs | 10 +++++++-- feather/server/src/systems.rs | 2 +- feather/server/src/systems/tablist.rs | 30 ++++++++++++++------------- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index 75254dd2e..d4c0ec6de 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -81,4 +81,4 @@ pub struct TablistHeaderFooter { } #[derive(Debug)] -pub struct TablistExtrasUpdateEvent; \ No newline at end of file +pub struct TablistExtrasUpdateEvent; diff --git a/feather/server/src/client.rs b/feather/server/src/client.rs index 07e8fea96..954d5638f 100644 --- a/feather/server/src/client.rs +++ b/feather/server/src/client.rs @@ -18,7 +18,10 @@ use common::{ Window, }; use libcraft_items::InventorySlot; -use packets::server::{Particle, SetSlot, SpawnLivingEntity, UpdateLight, WindowConfirmation, PlayerListHeaderAndFooter}; +use packets::server::{ + Particle, PlayerListHeaderAndFooter, SetSlot, SpawnLivingEntity, UpdateLight, + WindowConfirmation, +}; use protocol::packets::server::{ EntityPosition, EntityPositionAndRotation, EntityTeleport, HeldItemChange, PlayerAbilities, }; @@ -333,7 +336,10 @@ impl Client { pub fn send_tablist_header_footer(&self, header: &str, footer: &str) { log::trace!("Sending PlayerListHeaderAndFooter ({},{})", header, footer); - self.send_packet(PlayerListHeaderAndFooter {header: header.to_string(), footer: footer.to_string()}) + self.send_packet(PlayerListHeaderAndFooter { + header: header.to_string(), + footer: footer.to_string(), + }) } pub fn unload_entity(&self, id: NetworkId) { diff --git a/feather/server/src/systems.rs b/feather/server/src/systems.rs index b7ddb79ce..17aa58a30 100644 --- a/feather/server/src/systems.rs +++ b/feather/server/src/systems.rs @@ -30,7 +30,7 @@ pub fn register(server: Server, game: &mut Game, systems: &mut SystemExecutor) { - game.insert_resource(TablistHeaderFooter { header: "{\"text\":\"\"}".to_string(), footer: "{\"text\":\"\"}".to_string() }); +pub fn register(game: &mut Game, systems: &mut SystemExecutor) { + game.insert_resource(TablistHeaderFooter { + header: "{\"text\":\"\"}".to_string(), + footer: "{\"text\":\"\"}".to_string(), + }); systems .group::() .add_system(remove_tablist_players) @@ -67,24 +70,23 @@ fn add_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { } fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { - for _ in game - .ecs - .query::<&TablistExtrasUpdateEvent>() - .iter() - { + for _ in game.ecs.query::<&TablistExtrasUpdateEvent>().iter() { let header_footer = game.resources.get::()?; - server.broadcast_with(|client| client.send_tablist_header_footer(&header_footer.header, &header_footer.footer)); + server.broadcast_with(|client| { + client.send_tablist_header_footer(&header_footer.header, &header_footer.footer) + }); } Ok(()) } fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResult { - for (_, (_, &client_id)) in game - .ecs - .query::<(&PlayerJoinEvent, &ClientId)>() - .iter(){ + for (_, (_, &client_id)) in game.ecs.query::<(&PlayerJoinEvent, &ClientId)>().iter() { let header_footer = game.resources.get::()?; - server.clients.get(client_id).unwrap().send_tablist_header_footer(&header_footer.header, &header_footer.footer); + server + .clients + .get(client_id) + .unwrap() + .send_tablist_header_footer(&header_footer.header, &header_footer.footer); } Ok(()) } From e4507b1881859749274bd493b2cb9707ac174b80 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Tue, 18 Jan 2022 22:01:35 +0100 Subject: [PATCH 04/11] Use `libcraft_text` instead of `String` --- Cargo.lock | 2 ++ feather/common/Cargo.toml | 1 + feather/common/src/events.rs | 5 +++-- feather/server/Cargo.toml | 1 + feather/server/src/systems/tablist.rs | 9 +++++---- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f6eaa755..fbd7d211c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -828,6 +828,7 @@ dependencies = [ "libcraft-core", "libcraft-inventory", "libcraft-items", + "libcraft-text", "log", "parking_lot", "quill-common", @@ -947,6 +948,7 @@ dependencies = [ "hematite-nbt", "libcraft-core", "libcraft-items", + "libcraft-text", "log", "md-5", "num-bigint 0.4.2", diff --git a/feather/common/Cargo.toml b/feather/common/Cargo.toml index a371549d5..2789ed83f 100644 --- a/feather/common/Cargo.toml +++ b/feather/common/Cargo.toml @@ -21,6 +21,7 @@ uuid = { version = "0.8", features = [ "v4" ] } libcraft-core = { path = "../../libcraft/core" } libcraft-inventory = { path = "../../libcraft/inventory" } libcraft-items = { path = "../../libcraft/items" } +libcraft-text = { path = "../../libcraft/text" } rayon = "1.5" worldgen = { path = "../worldgen", package = "feather-worldgen" } rand = "0.8" \ No newline at end of file diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index d4c0ec6de..ffa2505e2 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -1,4 +1,5 @@ use base::{ChunkHandle, ChunkPosition}; +use libcraft_text::Text; use crate::view::View; @@ -76,8 +77,8 @@ pub struct EntityCreateEvent; #[derive(Debug, Clone)] pub struct TablistHeaderFooter { - pub header: String, - pub footer: String, + pub header: Text, + pub footer: Text, } #[derive(Debug)] diff --git a/feather/server/Cargo.toml b/feather/server/Cargo.toml index 4e9758fa4..86b81a5fd 100644 --- a/feather/server/Cargo.toml +++ b/feather/server/Cargo.toml @@ -51,6 +51,7 @@ uuid = "0.8" slab = "0.4" libcraft-core = { path = "../../libcraft/core" } libcraft-items = { path = "../../libcraft/items" } +libcraft-text = { path = "../../libcraft/text" } worldgen = { path = "../worldgen", package = "feather-worldgen" } [features] diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index b80984829..fdcc1485e 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -5,6 +5,7 @@ use common::{ events::{EntityRemoveEvent, PlayerJoinEvent, TablistExtrasUpdateEvent, TablistHeaderFooter}, Game, }; +use libcraft_text::{TextComponent, Text}; use ecs::{SysResult, SystemExecutor}; use quill_common::{components::Name, entities::Player}; use uuid::Uuid; @@ -13,8 +14,8 @@ use crate::{ClientId, Server}; pub fn register(game: &mut Game, systems: &mut SystemExecutor) { game.insert_resource(TablistHeaderFooter { - header: "{\"text\":\"\"}".to_string(), - footer: "{\"text\":\"\"}".to_string(), + header: Text::Component(Box::new(TextComponent::empty())), + footer: Text::Component(Box::new(TextComponent::empty())), }); systems .group::() @@ -73,7 +74,7 @@ fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { for _ in game.ecs.query::<&TablistExtrasUpdateEvent>().iter() { let header_footer = game.resources.get::()?; server.broadcast_with(|client| { - client.send_tablist_header_footer(&header_footer.header, &header_footer.footer) + client.send_tablist_header_footer(&header_footer.header.to_string(), &header_footer.footer.to_string()) }); } Ok(()) @@ -86,7 +87,7 @@ fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResul .clients .get(client_id) .unwrap() - .send_tablist_header_footer(&header_footer.header, &header_footer.footer); + .send_tablist_header_footer(&header_footer.header.to_string(), &header_footer.footer.to_string()); } Ok(()) } From ba952b31993833dbaaf657299b23f46e18629e28 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Tue, 18 Jan 2022 22:26:30 +0100 Subject: [PATCH 05/11] Cargo fmt --- feather/server/src/systems/tablist.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index fdcc1485e..0f9834aaf 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -5,8 +5,8 @@ use common::{ events::{EntityRemoveEvent, PlayerJoinEvent, TablistExtrasUpdateEvent, TablistHeaderFooter}, Game, }; -use libcraft_text::{TextComponent, Text}; use ecs::{SysResult, SystemExecutor}; +use libcraft_text::{Text, TextComponent}; use quill_common::{components::Name, entities::Player}; use uuid::Uuid; @@ -74,7 +74,10 @@ fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { for _ in game.ecs.query::<&TablistExtrasUpdateEvent>().iter() { let header_footer = game.resources.get::()?; server.broadcast_with(|client| { - client.send_tablist_header_footer(&header_footer.header.to_string(), &header_footer.footer.to_string()) + client.send_tablist_header_footer( + &header_footer.header.to_string(), + &header_footer.footer.to_string(), + ) }); } Ok(()) @@ -87,7 +90,10 @@ fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResul .clients .get(client_id) .unwrap() - .send_tablist_header_footer(&header_footer.header.to_string(), &header_footer.footer.to_string()); + .send_tablist_header_footer( + &header_footer.header.to_string(), + &header_footer.footer.to_string(), + ); } Ok(()) } From 48f8f42d7b1fde32e7d93de381195196cf4a0817 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Tue, 18 Jan 2022 22:51:02 +0100 Subject: [PATCH 06/11] Cargo fmt --- feather/server/src/systems/tablist.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index 873022d19..f278b096f 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -5,9 +5,9 @@ use common::{ events::{TablistExtrasUpdateEvent, TablistHeaderFooter}, Game, }; -use quill_common::events::{EntityRemoveEvent, PlayerJoinEvent}; use ecs::{SysResult, SystemExecutor}; use libcraft_text::{Text, TextComponent}; +use quill_common::events::{EntityRemoveEvent, PlayerJoinEvent}; use quill_common::{components::Name, entities::Player}; use uuid::Uuid; From 22f2902b91ca0028b54915c5d9aabccd686584e4 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Thu, 20 Jan 2022 21:36:08 +0100 Subject: [PATCH 07/11] Use default values for `TablistHeaderFooter` Add configurable values to config.toml --- feather/server/config.toml | 2 ++ feather/server/src/config.rs | 6 +++++- feather/server/src/options.rs | 8 +++++++- feather/server/src/systems/tablist.rs | 8 +++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/feather/server/config.toml b/feather/server/config.toml index 5e9efff7a..548affe32 100644 --- a/feather/server/config.toml +++ b/feather/server/config.toml @@ -13,6 +13,8 @@ motd = "A Feather server" max_players = 16 default_gamemode = "creative" view_distance = 12 +default_header = "" +default_footer = "" [log] # If you prefer less verbose logs, switch this to "info". diff --git a/feather/server/src/config.rs b/feather/server/src/config.rs index 9111a037f..03797572c 100644 --- a/feather/server/src/config.rs +++ b/feather/server/src/config.rs @@ -3,7 +3,7 @@ use std::{fs, net::IpAddr, path::Path, str::FromStr}; use anyhow::Context; -use base::Gamemode; +use base::{Gamemode, Text}; use serde::{Deserialize, Deserializer}; use crate::{favicon::Favicon, Options}; @@ -66,6 +66,8 @@ impl Config { view_distance: self.server.view_distance, max_players: self.server.max_players, default_gamemode: self.server.default_gamemode, + default_header: self.server.default_header.clone(), + default_footer: self.server.default_footer.clone(), proxy_mode: match self.proxy.proxy_mode { ProxyMode::None => None, ProxyMode::Bungee => Some(crate::options::ProxyMode::Bungeecord), @@ -90,6 +92,8 @@ pub struct ServerConfig { pub max_players: u32, pub default_gamemode: Gamemode, pub view_distance: u32, + pub default_header: Text, + pub default_footer: Text, } #[derive(Debug, Deserialize)] diff --git a/feather/server/src/options.rs b/feather/server/src/options.rs index f75fc203f..956e1efdb 100644 --- a/feather/server/src/options.rs +++ b/feather/server/src/options.rs @@ -1,4 +1,4 @@ -use base::Gamemode; +use base::{Gamemode, Text}; use crate::favicon::Favicon; @@ -28,6 +28,12 @@ pub struct Options { /// The default gamemode for new players. pub default_gamemode: Gamemode, + /// The default tablist header. + pub default_header: Text, + + /// The default tablist footer. + pub default_footer: Text, + /// Proxy IP forwarding mode pub proxy_mode: Option, // HMAC key used with Velocity IP forwarding. diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index f278b096f..e624c3dd5 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -6,7 +6,6 @@ use common::{ Game, }; use ecs::{SysResult, SystemExecutor}; -use libcraft_text::{Text, TextComponent}; use quill_common::events::{EntityRemoveEvent, PlayerJoinEvent}; use quill_common::{components::Name, entities::Player}; use uuid::Uuid; @@ -14,10 +13,13 @@ use uuid::Uuid; use crate::{ClientId, Server}; pub fn register(game: &mut Game, systems: &mut SystemExecutor) { + let server_options = game.resources.get::().unwrap().options.clone(); + game.insert_resource(TablistHeaderFooter { - header: Text::Component(Box::new(TextComponent::empty())), - footer: Text::Component(Box::new(TextComponent::empty())), + header: server_options.default_header.clone(), + footer: server_options.default_footer.clone(), }); + systems .group::() .add_system(remove_tablist_players) From 7e0535f5c52cb6bbd8a20c29a9a27c7ce87eeea1 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Fri, 21 Jan 2022 11:26:41 +0100 Subject: [PATCH 08/11] Add default values for tablist header Rename `default_header` to `tablist_header` Rename `default_footer` to `tablist_footer` --- feather/server/config.toml | 4 ++-- feather/server/src/client.rs | 1 - feather/server/src/config.rs | 8 ++++---- feather/server/src/options.rs | 4 ++-- feather/server/src/systems/tablist.rs | 10 +++++----- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/feather/server/config.toml b/feather/server/config.toml index 548affe32..0dc45c588 100644 --- a/feather/server/config.toml +++ b/feather/server/config.toml @@ -13,8 +13,8 @@ motd = "A Feather server" max_players = 16 default_gamemode = "creative" view_distance = 12 -default_header = "" -default_footer = "" +tablist_header = "A Feather Server" +tablist_footer = "" [log] # If you prefer less verbose logs, switch this to "info". diff --git a/feather/server/src/client.rs b/feather/server/src/client.rs index f23f50cfe..e2dbd733e 100644 --- a/feather/server/src/client.rs +++ b/feather/server/src/client.rs @@ -335,7 +335,6 @@ impl Client { self.send_packet(PlayerInfo::RemovePlayers(vec![uuid])); } - pub fn send_tablist_header_footer(&self, header: &str, footer: &str) { log::trace!("Sending PlayerListHeaderAndFooter ({},{})", header, footer); self.send_packet(PlayerListHeaderAndFooter { diff --git a/feather/server/src/config.rs b/feather/server/src/config.rs index 03797572c..0cbc49155 100644 --- a/feather/server/src/config.rs +++ b/feather/server/src/config.rs @@ -66,8 +66,8 @@ impl Config { view_distance: self.server.view_distance, max_players: self.server.max_players, default_gamemode: self.server.default_gamemode, - default_header: self.server.default_header.clone(), - default_footer: self.server.default_footer.clone(), + tablist_header: self.server.tablist_header.clone(), + tablist_footer: self.server.tablist_footer.clone(), proxy_mode: match self.proxy.proxy_mode { ProxyMode::None => None, ProxyMode::Bungee => Some(crate::options::ProxyMode::Bungeecord), @@ -92,8 +92,8 @@ pub struct ServerConfig { pub max_players: u32, pub default_gamemode: Gamemode, pub view_distance: u32, - pub default_header: Text, - pub default_footer: Text, + pub tablist_header: Text, + pub tablist_footer: Text, } #[derive(Debug, Deserialize)] diff --git a/feather/server/src/options.rs b/feather/server/src/options.rs index 956e1efdb..ecac92354 100644 --- a/feather/server/src/options.rs +++ b/feather/server/src/options.rs @@ -29,10 +29,10 @@ pub struct Options { pub default_gamemode: Gamemode, /// The default tablist header. - pub default_header: Text, + pub tablist_header: Text, /// The default tablist footer. - pub default_footer: Text, + pub tablist_footer: Text, /// Proxy IP forwarding mode pub proxy_mode: Option, diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index 05b603b6e..c348ad7e7 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -17,8 +17,8 @@ pub fn register(game: &mut Game, systems: &mut SystemExecutor) { let server_options = game.resources.get::().unwrap().options.clone(); game.insert_resource(TablistHeaderFooter { - header: server_options.default_header.clone(), - footer: server_options.default_footer.clone(), + header: server_options.tablist_header.clone(), + footer: server_options.tablist_footer.clone(), }); systems @@ -99,9 +99,9 @@ fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResul &header_footer.header.to_string(), &header_footer.footer.to_string(), ); - } - Ok(()) - } + } + Ok(()) +} fn change_tablist_player_gamemode(game: &mut Game, server: &mut Server) -> SysResult { for (_, (event, &uuid)) in game.ecs.query::<(&GamemodeEvent, &Uuid)>().iter() { From 45d01dfc44d6d1c03210258c16cf22de52bae5d8 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Fri, 21 Jan 2022 20:45:47 +0100 Subject: [PATCH 09/11] Move `TablistHeaderFooter` to quill/common/tablist.rs Rename `update_tablist_header` to `update_tablist_header_footer` Rename `send_tablist_header_on_join` to `send_tablist_header_footer_on_join` --- feather/common/src/events.rs | 7 ------- feather/server/src/systems/tablist.rs | 15 ++++++--------- quill/common/src/lib.rs | 1 + quill/common/src/tablist.rs | 7 +++++++ 4 files changed, 14 insertions(+), 16 deletions(-) create mode 100644 quill/common/src/tablist.rs diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index 90ca5567f..12511d65d 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -1,5 +1,4 @@ use base::{ChunkHandle, ChunkPosition}; -use libcraft_text::Text; use crate::view::View; @@ -60,11 +59,5 @@ pub struct ChunkLoadFailEvent { pub position: ChunkPosition, } -#[derive(Debug, Clone)] -pub struct TablistHeaderFooter { - pub header: Text, - pub footer: Text, -} - #[derive(Debug)] pub struct TablistExtrasUpdateEvent; diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index c348ad7e7..55283638a 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -3,13 +3,10 @@ use uuid::Uuid; use base::{Gamemode, ProfileProperty}; -use common::{ - events::{TablistExtrasUpdateEvent, TablistHeaderFooter}, - Game, -}; +use common::{events::TablistExtrasUpdateEvent, Game}; use ecs::{SysResult, SystemExecutor}; use quill_common::events::{EntityRemoveEvent, GamemodeEvent, PlayerJoinEvent}; -use quill_common::{components::Name, entities::Player}; +use quill_common::{components::Name, entities::Player, tablist::TablistHeaderFooter}; use crate::{ClientId, Server}; @@ -25,8 +22,8 @@ pub fn register(game: &mut Game, systems: &mut SystemExecutor) { .group::() .add_system(remove_tablist_players) .add_system(add_tablist_players) - .add_system(update_tablist_header) - .add_system(send_tablist_header_on_join) + .add_system(update_tablist_header_footer) + .add_system(send_tablist_header_footer_on_join) .add_system(change_tablist_player_gamemode); } @@ -75,7 +72,7 @@ fn add_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { Ok(()) } -fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { +fn update_tablist_header_footer(game: &mut Game, server: &mut Server) -> SysResult { for _ in game.ecs.query::<&TablistExtrasUpdateEvent>().iter() { let header_footer = game.resources.get::()?; server.broadcast_with(|client| { @@ -88,7 +85,7 @@ fn update_tablist_header(game: &mut Game, server: &mut Server) -> SysResult { Ok(()) } -fn send_tablist_header_on_join(game: &mut Game, server: &mut Server) -> SysResult { +fn send_tablist_header_footer_on_join(game: &mut Game, server: &mut Server) -> SysResult { for (_, (_, &client_id)) in game.ecs.query::<(&PlayerJoinEvent, &ClientId)>().iter() { let header_footer = game.resources.get::()?; server diff --git a/quill/common/src/lib.rs b/quill/common/src/lib.rs index 53d8a262b..bf64a5d04 100644 --- a/quill/common/src/lib.rs +++ b/quill/common/src/lib.rs @@ -8,6 +8,7 @@ pub mod entities; pub mod entity; pub mod entity_init; pub mod events; +pub mod tablist; use std::marker::PhantomData; diff --git a/quill/common/src/tablist.rs b/quill/common/src/tablist.rs new file mode 100644 index 000000000..68deeb48e --- /dev/null +++ b/quill/common/src/tablist.rs @@ -0,0 +1,7 @@ +use libcraft_text::Text; + +#[derive(Debug, Clone)] +pub struct TablistHeaderFooter { + pub header: Text, + pub footer: Text, +} From b0c2320fa361469867373492e31d97de4290eb43 Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Wed, 26 Jan 2022 20:29:06 +0100 Subject: [PATCH 10/11] Remove `tablist_header` and `tablist_footer` from `Options` Add config to resources --- feather/server/src/config.rs | 2 -- feather/server/src/main.rs | 12 +++++++----- feather/server/src/options.rs | 8 +------- feather/server/src/systems/tablist.rs | 14 +++++++++----- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/feather/server/src/config.rs b/feather/server/src/config.rs index 0cbc49155..c874c0353 100644 --- a/feather/server/src/config.rs +++ b/feather/server/src/config.rs @@ -66,8 +66,6 @@ impl Config { view_distance: self.server.view_distance, max_players: self.server.max_players, default_gamemode: self.server.default_gamemode, - tablist_header: self.server.tablist_header.clone(), - tablist_footer: self.server.tablist_footer.clone(), proxy_mode: match self.proxy.proxy_mode { ProxyMode::None => None, ProxyMode::Bungee => Some(crate::options::ProxyMode::Bungeecord), diff --git a/feather/server/src/main.rs b/feather/server/src/main.rs index c3bf7ea16..9d90f4d06 100644 --- a/feather/server/src/main.rs +++ b/feather/server/src/main.rs @@ -29,24 +29,26 @@ async fn main() -> anyhow::Result<()> { let options = config.to_options(); let server = Server::bind(options).await?; - let game = init_game(server, &config)?; + let game = init_game(server, config)?; run(game); Ok(()) } -fn init_game(server: Server, config: &Config) -> anyhow::Result { +fn init_game(server: Server, config: Config) -> anyhow::Result { let mut game = Game::new(); - init_systems(&mut game, server); - init_world_source(&mut game, config); + init_world_source(&mut game, &config); + init_systems(&mut game, server, config); init_plugin_manager(&mut game)?; Ok(game) } -fn init_systems(game: &mut Game, server: Server) { +fn init_systems(game: &mut Game, server: Server, config: Config) { let mut systems = SystemExecutor::new(); + game.insert_resource(config); + // Register common before server code, so // that packet broadcasting happens after // gameplay actions. diff --git a/feather/server/src/options.rs b/feather/server/src/options.rs index ecac92354..f75fc203f 100644 --- a/feather/server/src/options.rs +++ b/feather/server/src/options.rs @@ -1,4 +1,4 @@ -use base::{Gamemode, Text}; +use base::Gamemode; use crate::favicon::Favicon; @@ -28,12 +28,6 @@ pub struct Options { /// The default gamemode for new players. pub default_gamemode: Gamemode, - /// The default tablist header. - pub tablist_header: Text, - - /// The default tablist footer. - pub tablist_footer: Text, - /// Proxy IP forwarding mode pub proxy_mode: Option, // HMAC key used with Velocity IP forwarding. diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index 55283638a..92c548654 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -8,15 +8,19 @@ use ecs::{SysResult, SystemExecutor}; use quill_common::events::{EntityRemoveEvent, GamemodeEvent, PlayerJoinEvent}; use quill_common::{components::Name, entities::Player, tablist::TablistHeaderFooter}; +use crate::config::Config; use crate::{ClientId, Server}; pub fn register(game: &mut Game, systems: &mut SystemExecutor) { - let server_options = game.resources.get::().unwrap().options.clone(); + let (header, footer) = { + let server_config = &game.resources.get::().unwrap().server; + ( + server_config.tablist_header.clone(), + server_config.tablist_footer.clone(), + ) + }; - game.insert_resource(TablistHeaderFooter { - header: server_options.tablist_header.clone(), - footer: server_options.tablist_footer.clone(), - }); + game.insert_resource(TablistHeaderFooter { header, footer }); systems .group::() From 342dba2a18043bc96ac484e8eef4555c7a9c73dc Mon Sep 17 00:00:00 2001 From: Kecerim24 Date: Wed, 26 Jan 2022 21:52:06 +0100 Subject: [PATCH 11/11] Move `TablistExtrasUpdateEvent` to quill/common/srs/events/change.rs Add docs --- feather/common/src/events.rs | 3 --- feather/server/src/systems/tablist.rs | 11 ++++++++--- quill/common/src/component.rs | 2 ++ quill/common/src/events.rs | 2 +- quill/common/src/events/change.rs | 4 ++++ 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/feather/common/src/events.rs b/feather/common/src/events.rs index 12511d65d..114540089 100644 --- a/feather/common/src/events.rs +++ b/feather/common/src/events.rs @@ -58,6 +58,3 @@ pub struct ChunkLoadEvent { pub struct ChunkLoadFailEvent { pub position: ChunkPosition, } - -#[derive(Debug)] -pub struct TablistExtrasUpdateEvent; diff --git a/feather/server/src/systems/tablist.rs b/feather/server/src/systems/tablist.rs index 92c548654..86e5a53fe 100644 --- a/feather/server/src/systems/tablist.rs +++ b/feather/server/src/systems/tablist.rs @@ -3,10 +3,13 @@ use uuid::Uuid; use base::{Gamemode, ProfileProperty}; -use common::{events::TablistExtrasUpdateEvent, Game}; +use common::Game; use ecs::{SysResult, SystemExecutor}; -use quill_common::events::{EntityRemoveEvent, GamemodeEvent, PlayerJoinEvent}; -use quill_common::{components::Name, entities::Player, tablist::TablistHeaderFooter}; +use quill_common::events::{ + EntityRemoveEvent, GamemodeEvent, PlayerJoinEvent, TablistExtrasUpdateEvent, +}; +use quill_common::tablist::TablistHeaderFooter; +use quill_common::{components::Name, entities::Player}; use crate::config::Config; use crate::{ClientId, Server}; @@ -76,6 +79,7 @@ fn add_tablist_players(game: &mut Game, server: &mut Server) -> SysResult { Ok(()) } +/// Updates tablist header and footer when [TablistExtrasUpdateEvent] is raised fn update_tablist_header_footer(game: &mut Game, server: &mut Server) -> SysResult { for _ in game.ecs.query::<&TablistExtrasUpdateEvent>().iter() { let header_footer = game.resources.get::()?; @@ -89,6 +93,7 @@ fn update_tablist_header_footer(game: &mut Game, server: &mut Server) -> SysResu Ok(()) } +/// Sends tablist header and footer to players who join fn send_tablist_header_footer_on_join(game: &mut Game, server: &mut Server) -> SysResult { for (_, (_, &client_id)) in game.ecs.query::<(&PlayerJoinEvent, &ClientId)>().iter() { let header_footer = game.resources.get::()?; diff --git a/quill/common/src/component.rs b/quill/common/src/component.rs index 11e4c4651..f8073e85e 100644 --- a/quill/common/src/component.rs +++ b/quill/common/src/component.rs @@ -206,6 +206,7 @@ host_component_enum! { FlyingAbilityEvent = 1028, BuildingAbilityEvent = 1029, InvulnerabilityEvent = 1030, + TablistExtrasUpdateEvent = 1031, } } @@ -377,3 +378,4 @@ bincode_component_impl!(InstabreakEvent); bincode_component_impl!(FlyingAbilityEvent); bincode_component_impl!(BuildingAbilityEvent); bincode_component_impl!(InvulnerabilityEvent); +bincode_component_impl!(TablistExtrasUpdateEvent); diff --git a/quill/common/src/events.rs b/quill/common/src/events.rs index e253da176..f0190a56c 100644 --- a/quill/common/src/events.rs +++ b/quill/common/src/events.rs @@ -1,7 +1,7 @@ pub use block_interact::{BlockInteractEvent, BlockPlacementEvent}; pub use change::{ BuildingAbilityEvent, CreativeFlyingEvent, FlyingAbilityEvent, GamemodeEvent, InstabreakEvent, - InvulnerabilityEvent, SneakEvent, SprintEvent, + InvulnerabilityEvent, SneakEvent, SprintEvent, TablistExtrasUpdateEvent, }; pub use entity::{EntityCreateEvent, EntityRemoveEvent, PlayerJoinEvent}; pub use interact_entity::InteractEntityEvent; diff --git a/quill/common/src/events/change.rs b/quill/common/src/events/change.rs index 266846160..d7e4ccf87 100644 --- a/quill/common/src/events/change.rs +++ b/quill/common/src/events/change.rs @@ -64,3 +64,7 @@ pub struct BuildingAbilityEvent(pub bool); /// This event is called when player's invulnerability property changes. #[derive(Debug, Serialize, Deserialize, Clone, Deref)] pub struct InvulnerabilityEvent(pub bool); + +/// Raise this event to resend tablist extras to all players +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct TablistExtrasUpdateEvent;