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