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 {
|
||||
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();
|
||||
|
||||
|
@ -979,4 +979,38 @@ 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<(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::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,21 @@ where
|
||||
|
||||
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) => {
|
||||
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();
|
||||
Ok(Box::new(self.client_location.get_client_neighbors(id).unwrap().into_iter()
|
||||
|
Loading…
x
Reference in New Issue
Block a user