aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/server.rs124
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 } => {