diff options
author | metamuffin <metamuffin@disroot.org> | 2024-08-13 14:50:10 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-08-13 16:03:38 +0200 |
commit | 0f94e292bde8b9614aa48a6ba87f1a8d927b8133 (patch) | |
tree | fd8bb8c3d38c4b668c46b3b8d8a2b40e99ce2b97 /server/src/server.rs | |
parent | a8376aab4159a449a205de3ed7fdcaa5f6ca6369 (diff) | |
download | hurrycurry-0f94e292bde8b9614aa48a6ba87f1a8d927b8133.tar hurrycurry-0f94e292bde8b9614aa48a6ba87f1a8d927b8133.tar.bz2 hurrycurry-0f94e292bde8b9614aa48a6ba87f1a8d927b8133.tar.zst |
replace customers with bots and refactor some more server code.
Diffstat (limited to 'server/src/server.rs')
-rw-r--r-- | server/src/server.rs | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index faac080f..49d0b461 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -40,6 +40,7 @@ pub struct ServerState { pub lobby: bool, pub player_id_counter: PlayerID, pub score_changed: bool, + pub packet_loopback: VecDeque<PacketS>, } pub struct Server<'a> { @@ -218,6 +219,7 @@ impl ServerState { entities: vec![], player_id_counter: PlayerID(1), score_changed: false, + packet_loopback: VecDeque::new(), } } } @@ -230,17 +232,25 @@ impl Server<'_> { ) { self.game.load(gamedata, &serverdata, timer, packet_out); self.state.data = serverdata.into(); + for mut e in self.state.entities.drain(..) { + e.destructor(EntityContext { + game: self.game, + packet_out, + packet_in: &mut self.state.packet_loopback, + score_changed: &mut self.state.score_changed, + dt: 0., + }); + } self.state.entities = entities; } pub fn join_player( &mut self, + id: PlayerID, name: String, character: i32, packet_out: &mut VecDeque<PacketC>, - ) -> PlayerID { - let id = self.state.player_id_counter; - self.state.player_id_counter.0 += 1; + ) { let position = if character < 0 { self.state.data.customer_spawn } else { @@ -274,7 +284,6 @@ impl Server<'_> { position, character, }); - id } pub fn packet_in( @@ -284,8 +293,17 @@ impl Server<'_> { packet_out: &mut VecDeque<PacketC>, ) -> Result<()> { match packet { - PacketS::Join { name, character } => { - let id = self.join_player(name, character, packet_out); + PacketS::Join { + name, + character, + id, + } => { + let id = id.unwrap_or_else(|| { + let id = self.state.player_id_counter; + self.state.player_id_counter.0 += 1; + id + }); + self.join_player(id, name, character, packet_out); replies.push(PacketC::Joined { id }) } PacketS::Leave { player } => { @@ -586,20 +604,22 @@ impl Server<'_> { ); } - let mut packet_in = VecDeque::new(); for entity in self.state.entities.iter_mut() { if let Err(e) = entity.tick(EntityContext { game: self.game, packet_out, score_changed: &mut self.state.score_changed, - packet_in: &mut packet_in, + packet_in: &mut self.state.packet_loopback, dt, }) { warn!("entity tick failed: {e}") } } - for p in packet_in.drain(..) { - let _ = self.packet_in(p, &mut vec![], packet_out); + + while let Some(p) = self.state.packet_loopback.pop_front() { + if let Err(e) = self.packet_in(p, &mut vec![], packet_out) { + warn!("internal packet errored: {e}"); + } } let now = Instant::now(); |