@ -86,62 +86,66 @@ pub fn join_room(id: ClientId,
-> Result < Box < dyn Iterator < Item = ( ClientId , SendShipPacket ) > + Send > , ShipError > {
-> Result < Box < dyn Iterator < Item = ( ClientId , SendShipPacket ) > + Send > , ShipError > {
let client = clients . get ( & id ) . ok_or ( ShipError ::ClientNotFound ( id ) ) ? ;
let client = clients . get ( & id ) . ok_or ( ShipError ::ClientNotFound ( id ) ) ? ;
let level = level_table . get_level_from_exp ( client . character . char_class , client . character . exp ) ;
let level = level_table . get_level_from_exp ( client . character . char_class , client . character . exp ) ;
let room = rooms . get ( pkt . item as usize ) . ok_or ( ShipError ::InvalidRoom ( pkt . item ) ) ? . as_ref ( ) . unwrap ( ) ; // clippy look what you made me do
// let room = rooms.get(pkt.item as usize).ok_or(ShipError::InvalidRoom(pkt.item))?.as_ref().unwrap(); // clippy look what you made me do
if let Some ( room ) = rooms . get ( pkt . item as usize ) . ok_or ( ShipError ::InvalidRoom ( pkt . item ) ) ? {
match room . mode . difficulty ( ) {
room ::Difficulty ::Ultimate = > {
if level < 80 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 80 \nto join Ultimate rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
room ::Difficulty ::VeryHard = > {
if level < 40 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 40 \nto join Very Hard rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
room ::Difficulty ::Hard = > {
if level < 20 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 20 \nto join Hard rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
_ = > { } ,
} ;
let original_area = client_location . get_area ( id ) . unwrap ( ) ;
let original_neighbors = client_location . get_client_neighbors ( id ) . unwrap ( ) ;
if room . bursting {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "player is bursting\nplease wait" . into ( ) ) ) ) ] . into_iter ( ) ) )
}
let room_id = RoomId ( pkt . item as usize ) ;
let original_room_clients = client_location . get_clients_in_room ( room_id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
client_location . add_client_to_room ( id , room_id ) . unwrap ( ) ; // TODO: show room full error or whatever
let client = clients . get ( & id ) . ok_or ( ShipError ::ClientNotFound ( id ) ) ? ;
let area_client = client_location . get_local_client ( id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
item_state . add_character_to_room ( room_id , & client . character , area_client ) ;
let leader = client_location . get_room_leader ( room_id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
let join_room = builder ::room ::join_room ( id , clients , client_location , room_id , room ) ? ;
let add_to = builder ::room ::add_to_room ( id , client , & area_client , & leader , item_state , level_table , room_id ) ? ;
let room = rooms . get_mut ( room_id . 0 ) . unwrap ( ) . as_mut ( ) . unwrap ( ) ;
room . bursting = true ;
let mut result : Box < dyn Iterator < Item = ( ClientId , SendShipPacket ) > + Send > = Box ::new (
vec ! [ ( id , SendShipPacket ::JoinRoom ( join_room ) ) ]
. into_iter ( )
. chain ( original_room_clients . into_iter ( )
. map ( move | c | ( c . client , SendShipPacket ::AddToRoom ( add_to . clone ( ) ) ) )
) ) ;
match room . mode . difficulty ( ) {
room ::Difficulty ::Ultimate = > {
if level < 80 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 80 \nto join Ultimate rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
room ::Difficulty ::VeryHard = > {
if level < 40 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 40 \nto join Very Hard rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
room ::Difficulty ::Hard = > {
if level < 20 {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "You must be at least level 20 \nto join Hard rooms." . into ( ) ) ) ) ] . into_iter ( ) ) )
}
} ,
_ = > { } ,
} ;
if let Ok ( leader ) = client_location . get_area_leader ( original_area ) {
let leave_lobby = SendShipPacket ::LeaveLobby ( LeaveLobby ::new ( area_client . local_client . id ( ) , leader . local_client . id ( ) ) ) ;
result = Box ::new ( result . chain ( original_neighbors . into_iter ( )
. map ( move | c | ( c . client , leave_lobby . clone ( ) ) ) ) )
let original_area = client_location . get_area ( id ) . unwrap ( ) ;
let original_neighbors = client_location . get_client_neighbors ( id ) . unwrap ( ) ;
if room . bursting {
return Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "player is bursting\nplease wait" . into ( ) ) ) ) ] . into_iter ( ) ) )
}
let room_id = RoomId ( pkt . item as usize ) ;
let original_room_clients = client_location . get_clients_in_room ( room_id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
client_location . add_client_to_room ( id , room_id ) . unwrap ( ) ; // TODO: show room full error or whatever
let client = clients . get ( & id ) . ok_or ( ShipError ::ClientNotFound ( id ) ) ? ;
let area_client = client_location . get_local_client ( id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
item_state . add_character_to_room ( room_id , & client . character , area_client ) ;
let leader = client_location . get_room_leader ( room_id ) . map_err ( | err | -> ClientLocationError { err . into ( ) } ) ? ;
let join_room = builder ::room ::join_room ( id , clients , client_location , room_id , room ) ? ;
let add_to = builder ::room ::add_to_room ( id , client , & area_client , & leader , item_state , level_table , room_id ) ? ;
let room = rooms . get_mut ( room_id . 0 ) . unwrap ( ) . as_mut ( ) . unwrap ( ) ;
room . bursting = true ;
let mut result : Box < dyn Iterator < Item = ( ClientId , SendShipPacket ) > + Send > = Box ::new (
vec ! [ ( id , SendShipPacket ::JoinRoom ( join_room ) ) ]
. into_iter ( )
. chain ( original_room_clients . into_iter ( )
. map ( move | c | ( c . client , SendShipPacket ::AddToRoom ( add_to . clone ( ) ) ) )
) ) ;
if let Ok ( leader ) = client_location . get_area_leader ( original_area ) {
let leave_lobby = SendShipPacket ::LeaveLobby ( LeaveLobby ::new ( area_client . local_client . id ( ) , leader . local_client . id ( ) ) ) ;
result = Box ::new ( result . chain ( original_neighbors . into_iter ( )
. map ( move | c | ( c . client , leave_lobby . clone ( ) ) ) ) )
}
Ok ( result )
} else {
Ok ( Box ::new ( vec ! [ ( id , SendShipPacket ::SmallDialog ( SmallDialog ::new ( "Game is no longer active" . into ( ) ) ) ) ] . into_iter ( ) ) )
}
}
Ok ( result )
}
}
pub fn done_bursting ( id : ClientId ,
pub fn done_bursting ( id : ClientId ,