Merge pull request 'sorting_items' (#245) from sorting_items into master
This commit is contained in:
		
						commit
						29c5f88427
					
				| @ -185,7 +185,7 @@ fn main() { | |||||||
|                     location: ItemLocation::Inventory { |                     location: ItemLocation::Inventory { | ||||||
|                         character_id: character.id, |                         character_id: character.id, | ||||||
|                         slot: 3, |                         slot: 3, | ||||||
|                         equipped: true, |                         equipped: false, | ||||||
|                     } |                     } | ||||||
|                 }).await.unwrap(); |                 }).await.unwrap(); | ||||||
|             entity_gateway.create_item( |             entity_gateway.create_item( | ||||||
| @ -205,7 +205,7 @@ fn main() { | |||||||
|                     location: ItemLocation::Inventory { |                     location: ItemLocation::Inventory { | ||||||
|                         character_id: character.id, |                         character_id: character.id, | ||||||
|                         slot: 4, |                         slot: 4, | ||||||
|                         equipped: true, |                         equipped: false, | ||||||
|                     } |                     } | ||||||
|                 }).await.unwrap(); |                 }).await.unwrap(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -631,5 +631,9 @@ impl CharacterInventory { | |||||||
|     pub fn items(&self) -> &Vec<InventoryItem> { |     pub fn items(&self) -> &Vec<InventoryItem> { | ||||||
|         &self.items |         &self.items | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     pub fn set_items(&mut self, sorted_items: Vec<InventoryItem>) { | ||||||
|  |         self.items = sorted_items; | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -979,4 +979,22 @@ impl ItemManager { | |||||||
|         }).await; |         }).await; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn player_sorts_items<EG: EntityGateway>(&mut self, | ||||||
|  |                                                         entity_gateway: &mut EG, | ||||||
|  |                                                         character: &CharacterEntity, | ||||||
|  |                                                         item_ids: [u32; 30]) | ||||||
|  |                                                         -> Result<(), ItemManagerError> { | ||||||
|  |         let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?; | ||||||
|  |         let sorted_inventory_items: Vec<InventoryItem>  = item_ids.iter() | ||||||
|  |                                                                     .filter(|&client_item_id| *client_item_id < 0xFFFFFFFF) | ||||||
|  |                                                                     .map(|&client_item_id| inventory.get_item_by_id(ClientItemId(client_item_id))) | ||||||
|  |                                                                     .filter(|&x| x.is_some() == true) | ||||||
|  |                                                                     .map(|x| x.cloned().unwrap()) | ||||||
|  |                                                                     .collect(); | ||||||
|  | 
 | ||||||
|  |         inventory.set_items(sorted_inventory_items); | ||||||
|  |         update_inventory_slots(entity_gateway, character, &inventory).await; | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ use crate::common::serverstate::ClientId; | |||||||
| use crate::common::leveltable::CharacterLevelTable; | use crate::common::leveltable::CharacterLevelTable; | ||||||
| use crate::ship::ship::{SendShipPacket, ShipError, Rooms, Clients, ItemDropLocation}; | use crate::ship::ship::{SendShipPacket, ShipError, Rooms, Clients, ItemDropLocation}; | ||||||
| use crate::ship::location::{ClientLocation, ClientLocationError}; | use crate::ship::location::{ClientLocation, ClientLocationError}; | ||||||
| use crate::ship::items::{ItemManager, ClientItemId}; | use crate::ship::items::{ItemManager, ClientItemId, InventoryItem}; | ||||||
| use crate::ship::packet::builder; | use crate::ship::packet::builder; | ||||||
| 
 | 
 | ||||||
| pub async fn request_exp<EG: EntityGateway>(id: ClientId, | pub async fn request_exp<EG: EntityGateway>(id: ClientId, | ||||||
| @ -356,3 +356,17 @@ where | |||||||
| 
 | 
 | ||||||
|     Ok(Box::new(None.into_iter())) |     Ok(Box::new(None.into_iter())) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | pub async fn player_sorts_items<EG>(id: ClientId, | ||||||
|  |                                     pkt: &SortItems, | ||||||
|  |                                     entity_gateway: &mut EG, | ||||||
|  |                                     clients: &Clients, | ||||||
|  |                                     item_manager: &mut ItemManager) | ||||||
|  |                                     -> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, ShipError> | ||||||
|  | where | ||||||
|  |     EG: EntityGateway | ||||||
|  | { | ||||||
|  |     let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?; | ||||||
|  |     item_manager.player_sorts_items(entity_gateway, &client.character, pkt.item_ids).await?; | ||||||
|  |     Ok(Box::new(None.into_iter())) // Do clients care about the order of other clients items?
 | ||||||
|  | } | ||||||
| @ -400,7 +400,9 @@ impl<EG: EntityGateway> ShipServerState<EG> { | |||||||
|             GameMessage::PlayerUnequipItem(player_unequip_item) => { |             GameMessage::PlayerUnequipItem(player_unequip_item) => { | ||||||
|                 handler::message::player_unequips_item(id, &player_unequip_item, &mut self.entity_gateway, &mut self.clients, &mut self.item_manager).await |                 handler::message::player_unequips_item(id, &player_unequip_item, &mut self.entity_gateway, &mut self.clients, &mut self.item_manager).await | ||||||
|             }, |             }, | ||||||
| 
 |             GameMessage::SortItems(sort_items) => { | ||||||
|  |                 handler::message::player_sorts_items(id, sort_items, &mut self.entity_gateway, &mut self.clients, &mut self.item_manager).await | ||||||
|  |             }, | ||||||
|             _ => { |             _ => { | ||||||
|                 let cmsg = msg.clone(); |                 let cmsg = msg.clone(); | ||||||
|                 Ok(Box::new(self.client_location.get_client_neighbors(id).unwrap().into_iter() |                 Ok(Box::new(self.client_location.get_client_neighbors(id).unwrap().into_iter() | ||||||
|  | |||||||
| @ -216,3 +216,88 @@ async fn test_unequip_armor_with_units() { | |||||||
|     assert!(unit1_equipped == false); |     assert!(unit1_equipped == false); | ||||||
|     assert!(unit2_equipped == false); |     assert!(unit2_equipped == false); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[async_std::test] | ||||||
|  | async fn test_sort_items() { | ||||||
|  |     let mut entity_gateway = InMemoryGateway::new(); | ||||||
|  | 
 | ||||||
|  |     let (_user1, char1) = new_user_character(&mut entity_gateway, "a1", "a").await; | ||||||
|  | 
 | ||||||
|  |     entity_gateway.create_item( | ||||||
|  |         item::NewItemEntity { | ||||||
|  |             item: item::ItemDetail::Armor( | ||||||
|  |                 item::armor::Armor{ | ||||||
|  |                     armor: item::armor::ArmorType::Frame, | ||||||
|  |                     dfp: 0, | ||||||
|  |                     evp: 0, | ||||||
|  |                     slots: 4, | ||||||
|  |                     modifiers: Vec::new(), | ||||||
|  |                 }), | ||||||
|  |             location: item::ItemLocation::Inventory { | ||||||
|  |                 character_id: char1.id, | ||||||
|  |                 slot: 0, | ||||||
|  |                 equipped: true, | ||||||
|  |             } | ||||||
|  |         }).await; | ||||||
|  | 
 | ||||||
|  |     entity_gateway.create_item( | ||||||
|  |         item::NewItemEntity { | ||||||
|  |             item: item::ItemDetail::Unit( | ||||||
|  |                 item::unit::Unit{ | ||||||
|  |                     unit: item::unit::UnitType::KnightPower, | ||||||
|  |                     modifier: None, | ||||||
|  |                     armor_slot: 0, | ||||||
|  |                 }), | ||||||
|  |             location: item::ItemLocation::Inventory { | ||||||
|  |                 character_id: char1.id, | ||||||
|  |                 slot: 1, | ||||||
|  |                 equipped: false, | ||||||
|  |             } | ||||||
|  |         }).await; | ||||||
|  | 
 | ||||||
|  |     entity_gateway.create_item( | ||||||
|  |         item::NewItemEntity { | ||||||
|  |             item: item::ItemDetail::Unit( | ||||||
|  |                 item::unit::Unit{ | ||||||
|  |                     unit: item::unit::UnitType::KnightPower, | ||||||
|  |                     modifier: Some(item::unit::UnitModifier::Plus), | ||||||
|  |                     armor_slot: 0, | ||||||
|  |                 }), | ||||||
|  |             location: item::ItemLocation::Inventory { | ||||||
|  |                 character_id: char1.id, | ||||||
|  |                 slot: 2, | ||||||
|  |                 equipped: false, | ||||||
|  |             } | ||||||
|  |         }).await; | ||||||
|  |     
 | ||||||
|  |     let mut ship = ShipServerState::builder() | ||||||
|  |         .gateway(entity_gateway.clone()) | ||||||
|  |         .build(); | ||||||
|  |     log_in_char(&mut ship, ClientId(1), "a1", "a").await; | ||||||
|  |     join_lobby(&mut ship, ClientId(1)).await; | ||||||
|  |     create_room(&mut ship, ClientId(1), "room", "").await; | ||||||
|  | 
 | ||||||
|  |     let old_items = entity_gateway.get_items_by_character(&char1.id).await.unwrap(); | ||||||
|  |     assert!(old_items[0].item.item_type() == item::ItemType::Armor(item::armor::ArmorType::Frame)); | ||||||
|  |     assert!(old_items[0].location == item::ItemLocation::Inventory{ | ||||||
|  |         character_id: char1.id, | ||||||
|  |         slot: 0, | ||||||
|  |         equipped: true, | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::SortItems(SortItems { | ||||||
|  |         client: 255, | ||||||
|  |         target: 255, | ||||||
|  |         item_ids: [0x10001u32, 0x10002, 0x10000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 
 | ||||||
|  |         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 
 | ||||||
|  |         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF], | ||||||
|  |     })))).await.unwrap().for_each(drop); | ||||||
|  | 
 | ||||||
|  |     let items = entity_gateway.get_items_by_character(&char1.id).await.unwrap(); | ||||||
|  |     assert!(items[0].item.item_type() == item::ItemType::Armor(item::armor::ArmorType::Frame)); | ||||||
|  |     assert!(items[0].location == item::ItemLocation::Inventory{ | ||||||
|  |         character_id: char1.id, | ||||||
|  |         slot: 2, | ||||||
|  |         equipped: true, | ||||||
|  |     }); | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user