diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/server.rs | 124 |
1 files changed, 57 insertions, 67 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index 43f2a59f..42412f2d 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -28,6 +28,7 @@ use hurrycurry_protocol::{ Gamedata, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerID, Score, TileIndex, }; use log::{info, warn}; +use rand::random; use std::{ collections::{HashMap, VecDeque}, sync::Arc, @@ -63,6 +64,14 @@ pub trait GameServerExt { timer: Option<Duration>, packet_out: &mut VecDeque<PacketC>, ); + fn join_player( + &mut self, + id: PlayerID, + name: String, + character: i32, + serverdata: &Serverdata, + packet_out: Option<&mut VecDeque<PacketC>>, + ); fn prime_client(&self) -> Vec<PacketC>; } impl GameServerExt for Game { @@ -126,30 +135,7 @@ impl GameServerExt for Game { } } for (id, (name, character)) in players { - self.players.insert( - id, - Player { - item: None, - character, - movement: MovementBase { - position: if character < 0 { - serverdata.customer_spawn - } else { - serverdata.chef_spawn - }, - input_direction: Vec2::ZERO, - input_boost: false, - facing: Vec2::X, - rotation: 0., - velocity: Vec2::ZERO, - boosting: false, - stamina: 0., - }, - communicate_persist: None, - interacting: None, - name: name.clone(), - }, - ); + self.join_player(id, name, character, serverdata, None); } packet_out.extend(self.prime_client()); @@ -209,6 +195,51 @@ impl GameServerExt for Game { }); out } + + fn join_player( + &mut self, + id: PlayerID, + name: String, + character: i32, + serverdata: &Serverdata, + packet_out: Option<&mut VecDeque<PacketC>>, + ) { + let position = if character < 0 { + serverdata.customer_spawn + } else { + serverdata.chef_spawn + } + (Vec2::new(random(), random()) - 0.5); + self.players.insert( + id, + Player { + item: None, + character, + movement: MovementBase { + position, + input_direction: Vec2::ZERO, + input_boost: false, + facing: Vec2::X, + rotation: 0., + velocity: Vec2::ZERO, + boosting: false, + stamina: 0., + }, + + communicate_persist: None, + interacting: None, + name: name.clone(), + }, + ); + self.score.players = self.score.players.max(self.players.len()); + if let Some(packet_out) = packet_out { + packet_out.push_back(PacketC::AddPlayer { + id, + name, + position, + character, + }); + } + } } impl ServerState { @@ -244,48 +275,6 @@ impl Server<'_> { self.state.entities = entities; } - pub fn join_player( - &mut self, - id: PlayerID, - name: String, - character: i32, - packet_out: &mut VecDeque<PacketC>, - ) { - let position = if character < 0 { - self.state.data.customer_spawn - } else { - self.state.data.chef_spawn - }; - self.game.players.insert( - id, - Player { - item: None, - character, - movement: MovementBase { - position, - input_direction: Vec2::ZERO, - input_boost: false, - facing: Vec2::X, - rotation: 0., - velocity: Vec2::ZERO, - boosting: false, - stamina: 0., - }, - - communicate_persist: None, - interacting: None, - name: name.clone(), - }, - ); - self.game.score.players = self.game.score.players.max(self.game.players.len()); - packet_out.push_back(PacketC::AddPlayer { - id, - name, - position, - character, - }); - } - pub fn packet_in( &mut self, packet: PacketS, @@ -303,7 +292,8 @@ impl Server<'_> { self.state.player_id_counter.0 += 1; id }); - self.join_player(id, name, character, packet_out); + self.game + .join_player(id, name, character, &self.state.data, Some(packet_out)); replies.push(PacketC::Joined { id }) } PacketS::Leave { player } => { |