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 { | ||||
|                         character_id: character.id, | ||||
|                         slot: 3, | ||||
|                         equipped: true, | ||||
|                         equipped: false, | ||||
|                     } | ||||
|                 }).await.unwrap(); | ||||
|             entity_gateway.create_item( | ||||
| @ -205,7 +205,7 @@ fn main() { | ||||
|                     location: ItemLocation::Inventory { | ||||
|                         character_id: character.id, | ||||
|                         slot: 4, | ||||
|                         equipped: true, | ||||
|                         equipped: false, | ||||
|                     } | ||||
|                 }).await.unwrap(); | ||||
| 
 | ||||
|  | ||||
| @ -631,5 +631,9 @@ impl CharacterInventory { | ||||
|     pub fn items(&self) -> &Vec<InventoryItem> { | ||||
|         &self.items | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_items(&mut self, sorted_items: Vec<InventoryItem>) { | ||||
|         self.items = sorted_items; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -979,4 +979,22 @@ impl ItemManager { | ||||
|         }).await; | ||||
|         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::ship::ship::{SendShipPacket, ShipError, Rooms, Clients, ItemDropLocation}; | ||||
| use crate::ship::location::{ClientLocation, ClientLocationError}; | ||||
| use crate::ship::items::{ItemManager, ClientItemId}; | ||||
| use crate::ship::items::{ItemManager, ClientItemId, InventoryItem}; | ||||
| use crate::ship::packet::builder; | ||||
| 
 | ||||
| pub async fn request_exp<EG: EntityGateway>(id: ClientId, | ||||
| @ -356,3 +356,17 @@ where | ||||
| 
 | ||||
|     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) => { | ||||
|                 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(); | ||||
|                 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!(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