diff options
Diffstat (limited to 'server/src/server.rs')
| -rw-r--r-- | server/src/server.rs | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index e56d8b59..87e77fb2 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -19,6 +19,7 @@ use crate::{ ConnectionID, entity::{Entities, EntityContext, construct_entity}, scoreboard::ScoreboardStore, + vote::VoteState, }; use anyhow::{Context, Result, anyhow}; use hurrycurry_data::{PrivateGamedata, build_gamedata, map_list}; @@ -30,7 +31,7 @@ use hurrycurry_locale::{ }; use hurrycurry_protocol::{ Character, Gamedata, Hand, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass, - PlayerID, Score, Serverdata, glam::Vec2, movement::MovementBase, + PlayerID, Score, Serverdata, VoteSubject, glam::Vec2, movement::MovementBase, }; use log::{info, warn}; use std::{ @@ -73,6 +74,7 @@ pub struct Server { pub announce_state: AnnounceState, pub game: Game, + pub vote_state: VoteState, pub data: Box<Serverdata>, pub priv_gamedata: Arc<PrivateGamedata>, pub entities: Entities, @@ -99,6 +101,7 @@ impl Server { name: config.name.clone(), }), config, + vote_state: VoteState::default(), game: Game::default(), tick_perf: (Duration::ZERO, 0), broadcast: tx, @@ -257,7 +260,7 @@ impl Server { } // Need to process loopback packets for entity despawn while let Some(p) = self.packet_loopback.pop_front() { - if let Err(e) = self.packet_in(None, p, &mut vec![]) { + if let Err(e) = self.packet_in(&mut vec![], p) { warn!("Internal entity destructor packet errored: {e}"); } } @@ -298,9 +301,8 @@ impl Server { pub fn packet_in( &mut self, - conn: Option<ConnectionID>, - packet: PacketS, replies: &mut Vec<PacketC>, + packet: PacketS, ) -> Result<(), TrError> { match packet { PacketS::Join { @@ -330,25 +332,19 @@ impl Server { &self.priv_gamedata, position, ); - if let Some(conn) = conn { - info!("{player} joined (owned by {conn})"); - } else { - info!("Server adds {player}"); - } + info!("{player} joined"); + self.vote_state.join(player); replies.push(PacketC::Joined { id: player }) } PacketS::Leave { player } => { - if let Some(conn) = conn { - info!("{player} left (owned by {conn})"); - } else { - info!("Server removes {player}"); - } + info!("{player} left"); if !self.game.remove_player(player) { return Err(tre!("s.error.no_player")); } self.game.players_spatial_index.remove_entry(player); self.player_inactivity_timers.remove(&player); self.last_movement_update.remove(&player); + self.vote_state.leave(player); } PacketS::Effect { player, name } => { self.packet_out.push_back(PacketC::Effect2 { @@ -464,7 +460,7 @@ impl Server { return Ok(()); }; if let Some(message) = &message { - let body = message.display_message(&GLOBAL_LOCALE, &self.game.data, &COLORED); + let body = message.display(&GLOBAL_LOCALE, &self.game.data, &COLORED); if !player_data.name.is_empty() { info!("[{player} {:?}] {body}", player_data.name); } else { @@ -514,6 +510,8 @@ impl Server { PacketS::ReplayTick { .. } => return Err(tre!("s.error.packet_not_supported")), PacketS::Idle { .. } | PacketS::Ready | PacketS::Keepalive => (), PacketS::Debug(d) => self.packet_out.push_back(PacketC::Debug(d)), + p @ PacketS::CastVote { .. } => self.vote_state.packet_in(p)?, + p @ PacketS::InitiateVote { .. } => self.vote_state.packet_in(p)?, } Ok(()) } @@ -593,13 +591,12 @@ impl Server { } for (player, hand) in players_auto_release.drain(..) { let _ = self.packet_in( - None, + &mut vec![], PacketS::Interact { target: None, player, hand, }, - &mut vec![], ); } @@ -638,12 +635,21 @@ impl Server { } }); + self.vote_state.tick(dt); + if let Some(subject) = self.vote_state.ratified.take() { + match subject { + VoteSubject::StartGame { config } => load_map = Some(config.map), + VoteSubject::EndGame => load_map = Some("lobby".to_string()), + VoteSubject::RestartGame => load_map = Some(self.game.data.current_map.clone()), + } + } + if let Some(map) = load_map { return Some((map, None)); } while let Some(p) = self.packet_loopback.pop_front() { - if let Err(e) = self.packet_in(None, p, &mut vec![]) { + if let Err(e) = self.packet_in(&mut vec![], p) { warn!("Internal packet errored: {e}"); } } |