floor item limit reached
This commit is contained in:
parent
e8494c5bbd
commit
602b6e96f7
@ -612,6 +612,9 @@ pub enum PgItemNoteDetail {
|
||||
Deposit {
|
||||
character_id: u32,
|
||||
bank: BankIdentifier,
|
||||
},
|
||||
FloorLimitReached {
|
||||
map_area: MapArea,
|
||||
}
|
||||
}
|
||||
|
||||
@ -658,7 +661,12 @@ impl From<ItemNote> for PgItemNoteDetail {
|
||||
character_id: character_id.0,
|
||||
bank,
|
||||
}
|
||||
}
|
||||
},
|
||||
ItemNote::FloorLimitReached { map_area } => {
|
||||
PgItemNoteDetail::FloorLimitReached {
|
||||
map_area: map_area,
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -703,6 +711,9 @@ impl From<PgItemNoteDetail> for ItemNote {
|
||||
character_id: CharacterEntityId(character_id),
|
||||
bank,
|
||||
},
|
||||
PgItemNoteDetail::FloorLimitReached { map_area } => ItemNote::FloorLimitReached {
|
||||
map_area: map_area,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ pub mod esweapon;
|
||||
|
||||
use serde::{Serialize, Deserialize};
|
||||
use crate::entity::character::CharacterEntityId;
|
||||
use crate::ship::items::ClientItemId;
|
||||
use crate::ship::map::MapArea;
|
||||
use crate::ship::drops::ItemDropType;
|
||||
|
||||
@ -74,6 +75,9 @@ pub enum ItemNote {
|
||||
character_id: CharacterEntityId,
|
||||
bank: BankIdentifier,
|
||||
},
|
||||
FloorLimitReached {
|
||||
map_area: MapArea,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
|
@ -1148,3 +1148,23 @@ where
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn delete_item_from_floor<'a, EG, TR>(
|
||||
map_area: MapArea
|
||||
) -> impl Fn((ItemStateProxy, TR), FloorItem)
|
||||
-> BoxFuture<'a, Result<((ItemStateProxy, TR), ()), anyhow::Error>>
|
||||
where
|
||||
EG: EntityGateway,
|
||||
TR: EntityGatewayTransaction<ParentGateway = EG> + Clone + 'a,
|
||||
{
|
||||
move |(item_state, transaction), floor_item| {
|
||||
Box::pin(async move {
|
||||
let transaction = floor_item.with_entity_id(transaction, |mut transaction, entity_id| {
|
||||
async move {
|
||||
transaction.gateway().add_item_note(&entity_id, ItemNote::FloorLimitReached { map_area: map_area }).await?;
|
||||
Ok(transaction)
|
||||
}}).await?;
|
||||
Ok(((item_state, transaction), ()))
|
||||
})
|
||||
}
|
||||
}
|
@ -508,3 +508,27 @@ where
|
||||
Ok((transaction, item))
|
||||
})
|
||||
}
|
||||
|
||||
pub async fn floor_item_limit_reached<'a, EG> (
|
||||
item_state: &'a mut ItemState,
|
||||
entity_gateway: &'a mut EG,
|
||||
character: &'a CharacterEntity,
|
||||
item_id: &'a ClientItemId,
|
||||
map_area: MapArea
|
||||
) -> BoxFuture<'a, Result<(), anyhow::Error>>
|
||||
where
|
||||
EG: EntityGateway + 'static,
|
||||
EG::Transaction<'a>: Clone,
|
||||
{
|
||||
entity_gateway.with_transaction(move |transaction| async move {
|
||||
let item_state_proxy = ItemStateProxy::new(item_state.clone());
|
||||
let((item_state_proxy, transaction), result) = ItemStateAction::default()
|
||||
.act(actions::take_item_from_floor(character.id, *item_id))
|
||||
.act(actions::delete_item_from_floor(map_area))
|
||||
.commit((item_state_proxy, transaction))
|
||||
.await?;
|
||||
|
||||
item_state_proxy.commit().await;
|
||||
Ok((transaction, result))
|
||||
})
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ use crate::ship::location::{ClientLocation, ClientLocationError};
|
||||
use crate::ship::items::ClientItemId;
|
||||
use crate::ship::packet::builder;
|
||||
use crate::ship::items::state::ItemState;
|
||||
use crate::ship::items::tasks::{drop_item, drop_partial_item, drop_meseta, equip_item, unequip_item, sort_inventory, use_item, feed_mag, sell_item, take_meseta};
|
||||
use crate::ship::items::tasks::{drop_item, drop_partial_item, drop_meseta, equip_item, unequip_item, sort_inventory, use_item, feed_mag, sell_item, take_meseta, floor_item_limit_reached};
|
||||
|
||||
pub async fn request_exp<EG>(id: ClientId,
|
||||
request_exp: RequestExp,
|
||||
@ -500,3 +500,28 @@ where
|
||||
})}).await??;
|
||||
Ok(Vec::new()) // TODO: send the packet to other clients
|
||||
}
|
||||
|
||||
pub async fn floor_item_limit_deletion<EG> (id: ClientId,
|
||||
floor_item_limit_delete: FloorItemLimitItemDeletion,
|
||||
entity_gateway: &mut EG,
|
||||
client_location: &ClientLocation,
|
||||
clients: &Clients,
|
||||
rooms: &Rooms,
|
||||
item_state: &mut ItemState)
|
||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error>
|
||||
where
|
||||
EG: EntityGateway + Clone + 'static,
|
||||
{
|
||||
let room_id = client_location.get_room(id).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
||||
let map_area = rooms.with(room_id, |room| Box::pin(async move {
|
||||
room.map_areas.get_area_map(floor_item_limit_delete.map_area)
|
||||
})).await??;
|
||||
|
||||
clients.with(id, |client| {
|
||||
let mut entity_gateway = entity_gateway.clone();
|
||||
let mut item_state = item_state.clone();
|
||||
Box::pin(async move {
|
||||
floor_item_limit_reached(&mut item_state, &mut entity_gateway, &client.character, &ClientItemId(floor_item_limit_delete.item_id), map_area).await
|
||||
})}).await??;
|
||||
Ok(Vec::new())
|
||||
}
|
@ -575,6 +575,10 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerState<EG> {
|
||||
GameMessage::PlayerSoldItem(player_sold_item) => {
|
||||
handler::message::player_sells_item(id, player_sold_item, &mut self.entity_gateway, &self.clients, &mut self.item_state).await?
|
||||
},
|
||||
GameMessage::FloorItemLimitItemDeletion(floor_item_limit_delete) => {
|
||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||
handler::message::floor_item_limit_deletion(id, floor_item_limit_delete, &mut self.entity_gateway, &block.client_location, &self.clients, &block.rooms, &mut self.item_state).await?
|
||||
},
|
||||
_ => {
|
||||
let cmsg = msg.clone();
|
||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||
|
Loading…
x
Reference in New Issue
Block a user