aboutsummaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-01 21:55:16 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-01 21:55:16 +0100
commit74ffa47147d2bb989057b4513075975c44c2bc42 (patch)
tree0a2242b25fefcf62f94ac6b712c9e937e3b8e35c /server/src/server.rs
parentd6acbd76a81bb97c1ff74a66a2af9b00713ca6d0 (diff)
downloadhurrycurry-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.rs55
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,