aboutsummaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/server.rs')
-rw-r--r--server/src/server.rs42
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}");
}
}