sort items packets and dont equip multiple items in main it's confusing
This commit is contained in:
		
							parent
							
								
									1b9eafeaa9
								
							
						
					
					
						commit
						45d9b82598
					
				| @ -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(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -979,4 +979,38 @@ 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<(usize, Option<&InventoryItem>)>  = item_ids.iter() | ||||||
|  |                                                                             .enumerate() | ||||||
|  |                                                                             .filter(|(slot, &client_item_id)| client_item_id < 0xFFFFFFFF) | ||||||
|  |                                                                             .map(|(slot, &client_item_id)| (slot, inventory.get_item_by_id(ClientItemId(client_item_id)))) | ||||||
|  |                                                                             .collect(); | ||||||
|  |         for (slot, item) in sorted_inventory_items { | ||||||
|  |             match item.unwrap() { | ||||||
|  |                 InventoryItem::Individual(i) => { | ||||||
|  |                     entity_gateway.change_item_location(&i.entity_id, ItemLocation::Inventory { | ||||||
|  |                         character_id: character.id, | ||||||
|  |                         slot: slot, | ||||||
|  |                         equipped: i.equipped, | ||||||
|  |                     }).await | ||||||
|  |                 }, | ||||||
|  |                 InventoryItem::Stacked(s) => { | ||||||
|  |                     for entity_id in s.entity_ids.iter() { | ||||||
|  |                         entity_gateway.change_item_location(&entity_id, ItemLocation::Inventory { | ||||||
|  |                             character_id: character.id, | ||||||
|  |                             slot: slot, | ||||||
|  |                             equipped: false, | ||||||
|  |                         }).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,21 @@ 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, | ||||||
|  |                                     client_location: &ClientLocation, | ||||||
|  |                                     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))?; | ||||||
|  |     let room_id = client_location.get_room(id).map_err(|err| -> ClientLocationError { err.into() })?; | ||||||
|  |     let clients_in_area = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?; | ||||||
|  |     item_manager.player_sorts_items(entity_gateway, &client.character, pkt.item_ids).await?; | ||||||
|  |     let sort_packet = pkt.clone(); | ||||||
|  |     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.client_location, &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() | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user