Browse Source

sends the client a message when selected lobby = current lobby

pbs
mht8355 5 years ago
parent
commit
a24381bc66
  1. 18
      src/ship/packet/handler/lobby.rs

18
src/ship/packet/handler/lobby.rs

@ -4,9 +4,10 @@ use crate::common::serverstate::ClientId;
use crate::common::leveltable::CharacterLevelTable; use crate::common::leveltable::CharacterLevelTable;
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients}; use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder}; use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS};
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS, ClientLocationError};
use crate::ship::packet; use crate::ship::packet;
use libpso::character::character; use libpso::character::character;
use crate::ship::location::ClientLocationError::GetAreaError;
// this function needs a better home // this function needs a better home
pub fn block_selected(id: ClientId, pub fn block_selected(id: ClientId,
@ -61,8 +62,12 @@ pub fn change_lobby(id: ClientId,
clients: &Clients, clients: &Clients,
level_table: &CharacterLevelTable) level_table: &CharacterLevelTable)
-> Result<Vec<(ClientId, SendShipPacket)>, ShipError> { -> Result<Vec<(ClientId, SendShipPacket)>, ShipError> {
let prev_area = client_location.get_area(id).unwrap();
let leave_lobby = packet::builder::lobby::remove_from_lobby(id, client_location).unwrap();
let prev_area = client_location.get_area(id).map_err(|err| -> ClientLocationError {err.into()})?;
if prev_area == RoomLobby::Lobby(LobbyId(requested_lobby as usize)) { // If the client is already in the selected lobby,
let dialog = SmallDialog::new(String::from("You are already in this Lobby!")); // Send a SmallDialog to prevent client softlock / server crash
return Ok(vec![(id, SendShipPacket::SmallDialog(dialog))])
}
let leave_lobby = packet::builder::lobby::remove_from_lobby(id, client_location)?;
let old_neighbors = client_location.get_client_neighbors(id).unwrap(); let old_neighbors = client_location.get_client_neighbors(id).unwrap();
let mut lobby = LobbyId(requested_lobby as usize); let mut lobby = LobbyId(requested_lobby as usize);
match client_location.add_client_to_lobby(id, lobby) { match client_location.add_client_to_lobby(id, lobby) {
@ -71,14 +76,11 @@ pub fn change_lobby(id: ClientId,
Err(err) => { Err(err) => {
match prev_area { match prev_area {
RoomLobby::Lobby(lobby) => { RoomLobby::Lobby(lobby) => {
let dialog = SmallDialog {
padding: [0, 0],
msg: String::from("Lobby is full."),
};
let dialog = SmallDialog::new(String::from("Lobby is full."));
return Ok(vec![(id, SendShipPacket::SmallDialog(dialog))]) return Ok(vec![(id, SendShipPacket::SmallDialog(dialog))])
} }
RoomLobby::Room(room) => { RoomLobby::Room(room) => {
lobby = client_location.add_client_to_next_available_lobby(id, lobby).unwrap();
lobby = client_location.add_client_to_next_available_lobby(id, lobby).map_err(|_| ShipError::TooManyClients)?;
} }
} }
} }

Loading…
Cancel
Save