diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-01 21:55:16 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-01 21:55:16 +0100 |
| commit | 74ffa47147d2bb989057b4513075975c44c2bc42 (patch) | |
| tree | 0a2242b25fefcf62f94ac6b712c9e937e3b8e35c /server/src/server.rs | |
| parent | d6acbd76a81bb97c1ff74a66a2af9b00713ca6d0 (diff) | |
| download | hurrycurry-74ffa47147d2bb989057b4513075975c44c2bc42.tar hurrycurry-74ffa47147d2bb989057b4513075975c44c2bc42.tar.bz2 hurrycurry-74ffa47147d2bb989057b4513075975c44c2bc42.tar.zst | |
add serverdata packet with data fields that dont change across games; add motd and server name
Diffstat (limited to 'server/src/server.rs')
| -rw-r--r-- | server/src/server.rs | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index 41156e6b..795192c5 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -21,7 +21,7 @@ use crate::{ scoreboard::ScoreboardStore, }; use anyhow::{Context, Result, anyhow}; -use hurrycurry_data::{Serverdata, build_data}; +use hurrycurry_data::{PrivateGamedata, build_gamedata, map_list}; use hurrycurry_game_core::{Game, Involvement, Item, Player, Tile}; use hurrycurry_locale::{ GLOBAL_LOCALE, TrError, @@ -30,7 +30,7 @@ use hurrycurry_locale::{ }; use hurrycurry_protocol::{ Character, Gamedata, Hand, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass, - PlayerID, Score, glam::Vec2, movement::MovementBase, + PlayerID, Score, Serverdata, glam::Vec2, movement::MovementBase, }; use log::{info, warn}; use std::{ @@ -60,6 +60,8 @@ pub struct ServerConfig { pub inactivity_timeout: f32, pub lobby: String, pub data_path: PathBuf, + pub motd: Option<String>, + pub name: String, } pub struct Server { @@ -71,8 +73,8 @@ pub struct Server { pub announce_state: AnnounceState, pub game: Game, - - pub data: Arc<Serverdata>, + pub data: Box<Serverdata>, + pub priv_gamedata: Arc<PrivateGamedata>, pub entities: Entities, pub score_changed: bool, pub packet_loopback: VecDeque<PacketS>, @@ -86,6 +88,17 @@ pub struct Server { impl Server { pub fn new(config: ServerConfig, tx: broadcast::Sender<PacketC>) -> Result<Self> { Ok(Self { + data: Box::new(Serverdata { + bot_algos: vec![ + "waiter".to_string(), + "simple".to_string(), + "dishwasher".to_string(), + "frank".to_string(), + ], + maps: map_list(&config.data_path)?, + motd: config.motd.clone(), + name: config.name.clone(), + }), config, game: Game::default(), tick_perf: (Duration::ZERO, 0), @@ -93,7 +106,7 @@ impl Server { announce_state: AnnounceState::Done, packet_out: VecDeque::new(), connections: HashMap::new(), - data: Serverdata::default().into(), + priv_gamedata: PrivateGamedata::default().into(), entities: Vec::new(), score_changed: false, packet_loopback: VecDeque::new(), @@ -111,6 +124,8 @@ impl Default for ServerConfig { data_path: "data".into(), inactivity_timeout: 60., lobby: "lobby".to_string(), + name: "A Hurry Curry! Server".to_string(), + motd: None, } } } @@ -120,7 +135,7 @@ pub trait GameServerExt { fn load( &mut self, gamedata: Gamedata, - serverdata: &Serverdata, + serverdata: &PrivateGamedata, timer: Option<Duration>, packet_out: &mut VecDeque<PacketC>, is_lobby: bool, @@ -132,7 +147,7 @@ pub trait GameServerExt { name: String, character: Character, class: PlayerClass, - serverdata: &Serverdata, + serverdata: &PrivateGamedata, custom_position: Option<Vec2>, packet_out: Option<&mut VecDeque<PacketC>>, ); @@ -161,7 +176,7 @@ impl GameServerExt for Game { fn load( &mut self, gamedata: Gamedata, - serverdata: &Serverdata, + serverdata: &PrivateGamedata, timer: Option<Duration>, packet_out: &mut VecDeque<PacketC>, is_lobby: bool, @@ -213,7 +228,7 @@ impl GameServerExt for Game { fn prime_client(&self) -> Vec<PacketC> { let mut out = Vec::new(); - out.push(PacketC::Data { + out.push(PacketC::GameData { data: { let mut k = self.data.as_ref().to_owned(); k.recipes.clear(); @@ -309,7 +324,7 @@ impl GameServerExt for Game { name: String, character: Character, class: PlayerClass, - serverdata: &Serverdata, + serverdata: &PrivateGamedata, custom_position: Option<Vec2>, packet_out: Option<&mut VecDeque<PacketC>>, ) { @@ -348,7 +363,7 @@ impl GameServerExt for Game { impl Server { pub fn load_map(&mut self, name: &str) -> Result<()> { self.load( - build_data(&self.config.data_path, name, true) + build_gamedata(&self.config.data_path, name, true) .context(anyhow!("preparing gamedata for {:?}", name))?, None, ); @@ -356,7 +371,7 @@ impl Server { } pub fn load( &mut self, - (gamedata, serverdata): (Gamedata, Serverdata), + (gamedata, serverdata): (Gamedata, PrivateGamedata), timer: Option<Duration>, ) { info!("Changing map to {:?}", gamedata.current_map); @@ -367,7 +382,7 @@ impl Server { packet_in: &mut self.packet_loopback, score_changed: &mut self.score_changed, scoreboard: &self.scoreboard, - serverdata: self.data.as_ref(), + serverdata: self.priv_gamedata.as_ref(), replies: None, dt: 0., load_map: &mut None, @@ -391,7 +406,7 @@ impl Server { for ed in &serverdata.entity_decls { self.entities.push(construct_entity(ed)); } - self.data = serverdata.into(); + self.priv_gamedata = serverdata.into(); for e in &mut self.entities { e.constructor(EntityContext { game: &mut self.game, @@ -399,7 +414,7 @@ impl Server { packet_in: &mut self.packet_loopback, score_changed: &mut self.score_changed, load_map: &mut None, - serverdata: &self.data, + serverdata: &self.priv_gamedata, scoreboard: &self.scoreboard, replies: None, dt: 0., @@ -445,7 +460,7 @@ impl Server { name, character, class, - &self.data, + &self.priv_gamedata, position, Some(&mut self.packet_out), ); @@ -541,7 +556,7 @@ impl Server { packet_in: &mut self.packet_loopback, score_changed: &mut self.score_changed, load_map: &mut None, - serverdata: &self.data, + serverdata: &self.priv_gamedata, scoreboard: &self.scoreboard, replies: Some(replies), dt: 0., @@ -754,7 +769,7 @@ impl Server { score_changed: &mut self.score_changed, packet_in: &mut self.packet_loopback, scoreboard: &self.scoreboard, - serverdata: &self.data, + serverdata: &self.priv_gamedata, replies: None, dt, }) { @@ -770,7 +785,7 @@ impl Server { score_changed: &mut self.score_changed, packet_in: &mut self.packet_loopback, scoreboard: &self.scoreboard, - serverdata: &self.data, + serverdata: &self.priv_gamedata, replies: None, dt: 0., }); @@ -794,7 +809,7 @@ impl Server { self.game.score.time_remaining -= dt as f64; if self.game.score.time_remaining < 0. { let relative_score = - (self.game.score.points * 100) / self.data.score_baseline.max(1); + (self.game.score.points * 100) / self.priv_gamedata.score_baseline.max(1); self.game.score.stars = match relative_score { 100.. => 3, 70.. => 2, |