Browse Source

Merge pull request 'add room password handling' (#115) from room_password into master

pbs
jake 5 years ago
parent
commit
2e46567987
  1. 2
      src/ship/location.rs
  2. 21
      src/ship/ship.rs

2
src/ship/location.rs

@ -159,7 +159,6 @@ impl ClientLocation {
Ok(()) Ok(())
} }
pub fn add_client_to_next_available_lobby(&mut self, id: ClientId, lobby: LobbyId) -> Result<LobbyId, JoinLobbyError> { pub fn add_client_to_next_available_lobby(&mut self, id: ClientId, lobby: LobbyId) -> Result<LobbyId, JoinLobbyError> {
let l = (0..15) let l = (0..15)
.map(|lobby_index| { .map(|lobby_index| {
@ -207,7 +206,6 @@ impl ClientLocation {
Ok(()) Ok(())
} }
pub fn get_all_clients_by_client(&self, id: ClientId) -> Result<Vec<AreaClient>, GetNeighborError> { pub fn get_all_clients_by_client(&self, id: ClientId) -> Result<Vec<AreaClient>, GetNeighborError> {
let area = self.client_location.get(&id).ok_or(GetNeighborError::InvalidClient)?; let area = self.client_location.get(&id).ok_or(GetNeighborError::InvalidClient)?;
match area { match area {

21
src/ship/ship.rs

@ -51,6 +51,7 @@ pub enum ShipError {
pub enum RecvShipPacket { pub enum RecvShipPacket {
Login(Login), Login(Login),
MenuSelect(MenuSelect), MenuSelect(MenuSelect),
RoomPasswordReq(RoomPasswordReq),
CharData(CharData), CharData(CharData),
Message(Message), Message(Message),
DirectMessage(DirectMessage), DirectMessage(DirectMessage),
@ -71,7 +72,11 @@ impl RecvServerPacket for RecvShipPacket {
fn from_bytes(data: &[u8]) -> Result<RecvShipPacket, PacketParseError> { fn from_bytes(data: &[u8]) -> Result<RecvShipPacket, PacketParseError> {
match u16::from_le_bytes([data[2], data[3]]) { match u16::from_le_bytes([data[2], data[3]]) {
0x93 => Ok(RecvShipPacket::Login(Login::from_bytes(data)?)), 0x93 => Ok(RecvShipPacket::Login(Login::from_bytes(data)?)),
0x10 => Ok(RecvShipPacket::MenuSelect(MenuSelect::from_bytes(data)?)),
0x10 => match data[0] {
16 => Ok(RecvShipPacket::MenuSelect(MenuSelect::from_bytes(data)?)),
48 => Ok(RecvShipPacket::RoomPasswordReq(RoomPasswordReq::from_bytes(data)?)),
_ => Err(PacketParseError::WrongPacketForServerType(u16::from_le_bytes([data[2], data[3]]), data.to_vec())),
},
0x61 => Ok(RecvShipPacket::CharData(CharData::from_bytes(data)?)), 0x61 => Ok(RecvShipPacket::CharData(CharData::from_bytes(data)?)),
0x60 => Ok(RecvShipPacket::Message(Message::from_bytes(data)?)), 0x60 => Ok(RecvShipPacket::Message(Message::from_bytes(data)?)),
0x62 => Ok(RecvShipPacket::DirectMessage(DirectMessage::from_bytes(data)?)), 0x62 => Ok(RecvShipPacket::DirectMessage(DirectMessage::from_bytes(data)?)),
@ -265,6 +270,20 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
_ => unreachable!(), _ => unreachable!(),
} }
}, },
RecvShipPacket::RoomPasswordReq(room_password_req) => {
if room_password_req.password == self.rooms[room_password_req.item as usize].as_ref()
.ok_or(ShipError::InvalidRoom(room_password_req.item))?
.password {
let menuselect = MenuSelect {
menu: room_password_req.menu,
item: room_password_req.item,
};
handler::room::join_room(id, &menuselect, &mut self.client_location, &mut self.clients, &self.level_table, &mut self.rooms)?
}
else {
Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("Incorrect password".into())))].into_iter())
}
},
RecvShipPacket::CharData(chardata) => { RecvShipPacket::CharData(chardata) => {
Box::new(handler::lobby::send_player_to_lobby(id, chardata, &mut self.client_location, &self.clients, &self.level_table)?.into_iter()) Box::new(handler::lobby::send_player_to_lobby(id, chardata, &mut self.client_location, &self.clients, &self.level_table)?.into_iter())
}, },

Loading…
Cancel
Save