diff options
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/entity/customers/mod.rs | 14 | ||||
| -rw-r--r-- | server/src/game.rs | 109 | 
2 files changed, 65 insertions, 58 deletions
| diff --git a/server/src/entity/customers/mod.rs b/server/src/entity/customers/mod.rs index e6067110..0bb3f918 100644 --- a/server/src/entity/customers/mod.rs +++ b/server/src/entity/customers/mod.rs @@ -33,7 +33,6 @@ pub struct Customers {      demands: Vec<Demand>,      cpackets: VecDeque<PacketS>,      chairs: HashMap<IVec2, bool>, -    customer_id_counter: PlayerID,      customers: HashMap<PlayerID, CustomerState>,      spawn_cooldown: f32,  } @@ -67,7 +66,6 @@ impl Customers {          }          Ok(Self {              chairs, -            customer_id_counter: PlayerID(0),              customers: Default::default(),              demands,              spawn_cooldown: 0., @@ -82,12 +80,12 @@ impl EntityT for Customers {          self.spawn_cooldown = self.spawn_cooldown.max(0.);          if self.customers.len() < 5 && self.spawn_cooldown <= 0. {              self.spawn_cooldown = 10. + random::<f32>() * 10.; -            self.customer_id_counter.0 -= 1; -            let id = self.customer_id_counter; -            self.cpackets.push_back(PacketS::Join { -                name: faker::name::fr_fr::Name().fake(), -                character: -1 - (random::<u16>() as i32), -            }); +            let id = game.join_player( +                faker::name::fr_fr::Name().fake(), +                -1 - (random::<u16>() as i32), +                packet_out, +            ); +              let chair = self.select_chair().ok_or(anyhow!("no free chair found"))?;              let from = game.data.customer_spawn.as_ivec2();              let path = find_path(&game.walkable, from, chair) diff --git a/server/src/game.rs b/server/src/game.rs index 6477d9fa..527ea65b 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -178,6 +178,7 @@ impl Game {                          } else {                              self.data.chef_spawn                          }, +                        direction: Vec2::ZERO,                          facing: Vec2::X,                          rotation: 0.,                          velocity: Vec2::ZERO, @@ -273,6 +274,55 @@ impl Game {          out      } +    pub fn join_player( +        &mut self, +        name: String, +        character: i32, +        packet_out: &mut VecDeque<PacketC>, +    ) -> PlayerID { +        let id = self.player_id_counter; +        self.player_id_counter.0 += 1; +        let position = if id.0 < 0 { +            self.data.customer_spawn +        } else { +            self.data.chef_spawn +        }; +        self.players.insert( +            id, +            Player { +                item: None, +                character, +                movement: MovementBase { +                    position: if character < 0 { +                        self.data.customer_spawn +                    } else { +                        self.data.chef_spawn +                    }, +                    direction: Vec2::ZERO, +                    facing: Vec2::X, +                    rotation: 0., +                    velocity: Vec2::ZERO, +                    boosting: false, +                    stamina: 0., +                }, +                last_position_update: Instant::now(), +                boost: false, +                direction: Vec2::ZERO, +                communicate_persist: None, +                interacting: None, +                name: name.clone(), +            }, +        ); +        self.score.players = self.score.players.max(self.players.len()); +        packet_out.push_back(PacketC::AddPlayer { +            id, +            name, +            position, +            character, +        }); +        id +    } +      pub fn packet_in(          &mut self,          packet: PacketS, @@ -281,48 +331,7 @@ impl Game {      ) -> Result<()> {          match packet {              PacketS::Join { name, character } => { -                let id = self.player_id_counter; -                self.player_id_counter.0 += 1; -                if self.players.contains_key(&id) { -                    bail!("You already joined.") -                } -                let position = if id.0 < 0 { -                    self.data.customer_spawn -                } else { -                    self.data.chef_spawn -                }; -                self.players.insert( -                    id, -                    Player { -                        item: None, -                        character, -                        movement: MovementBase { -                            position: if character < 0 { -                                self.data.customer_spawn -                            } else { -                                self.data.chef_spawn -                            }, -                            facing: Vec2::X, -                            rotation: 0., -                            velocity: Vec2::ZERO, -                            boosting: false, -                            stamina: 0., -                        }, -                        last_position_update: Instant::now(), -                        boost: false, -                        direction: Vec2::ZERO, -                        communicate_persist: None, -                        interacting: None, -                        name: name.clone(), -                    }, -                ); -                self.score.players = self.score.players.max(self.players.len()); -                packet_out.push_back(PacketC::AddPlayer { -                    id, -                    name, -                    position, -                    character, -                }); +                let id = self.join_player(name, character, packet_out);                  replies.push(PacketC::Joined { id })              }              PacketS::Leave { player } => { @@ -353,22 +362,22 @@ impl Game {                  direction,                  player,              } => { -                let player = self +                let pd = self                      .players                      .get_mut(&player)                      .ok_or(anyhow!("player does not exist"))?; -                player.direction = direction; -                player.boost = boosting; +                pd.direction = direction; +                pd.boost = boosting;                  if let Some(pos) = pos { -                    let dt = player.last_position_update.elapsed(); -                    player.last_position_update += dt; -                    let diff = pos - player.movement.position; -                    player.movement.position += diff.clamp_length_max(dt.as_secs_f32()); +                    let dt = pd.last_position_update.elapsed(); +                    pd.last_position_update += dt; +                    let diff = pos - pd.movement.position; +                    pd.movement.position += diff.clamp_length_max(dt.as_secs_f32());                      if diff.length() > 1. { -                        replies.push(PacketC::MovementSync); +                        replies.push(PacketC::MovementSync { player });                      }                  }              } | 
