split actions into actions+tasks
This commit is contained in:
		
							parent
							
								
									919d509c3a
								
							
						
					
					
						commit
						286b728441
					
				| @ -1,5 +1,4 @@ | ||||
| // TODO: replace various u32s and usizes denoting item amounts for ItemAmount(u32) for consistency
 | ||||
| 
 | ||||
| use crate::ship::items::ClientItemId; | ||||
| use crate::entity::item::{Meseta, ItemNote}; | ||||
| use std::future::Future; | ||||
| @ -7,10 +6,9 @@ use std::pin::Pin; | ||||
| 
 | ||||
| use crate::ship::map::MapArea; | ||||
| use crate::entity::character::{CharacterEntity, CharacterEntityId}; | ||||
| use crate::entity::gateway::{EntityGateway, EntityGatewayTransaction}; | ||||
| use crate::ship::items::state::{ItemState, ItemStateProxy, ItemStateError, AddItemResult, StackedItemDetail, IndividualItemDetail}; | ||||
| use crate::entity::gateway::EntityGatewayTransaction; | ||||
| use crate::ship::items::state::{ItemStateProxy, ItemStateError, AddItemResult, StackedItemDetail, IndividualItemDetail}; | ||||
| use crate::ship::items::bank::{BankItem, BankItemDetail}; | ||||
| use crate::ship::items::itemstateaction::{ItemStateAction, ItemAction}; | ||||
| use crate::ship::items::inventory::{InventoryItem, InventoryItemDetail}; | ||||
| use crate::ship::items::floor::{FloorItem, FloorItemDetail}; | ||||
| use crate::ship::items::apply_item::apply_item; | ||||
| @ -18,8 +16,6 @@ use crate::entity::item::{ItemDetail, NewItemEntity, TradeId}; | ||||
| use crate::entity::item::tool::Tool; | ||||
| use crate::entity::item::ItemModifier; | ||||
| use crate::ship::shops::ShopItem; | ||||
| use crate::ship::trade::TradeItem; | ||||
| use crate::ship::location::AreaClient; | ||||
| use crate::ship::drops::{ItemDrop, ItemDropType}; | ||||
| 
 | ||||
| pub enum TriggerCreateItem { | ||||
| @ -27,7 +23,7 @@ pub enum TriggerCreateItem { | ||||
|     No | ||||
| } | ||||
| 
 | ||||
| fn take_item_from_floor(character_id: CharacterEntityId, item_id: ClientItemId) | ||||
| pub(super) fn take_item_from_floor(character_id: CharacterEntityId, item_id: ClientItemId) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                            -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -42,7 +38,7 @@ fn take_item_from_floor(character_id: CharacterEntityId, item_id: ClientItemId) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_floor_item_to_inventory(character: &CharacterEntity) | ||||
| pub(super) fn add_floor_item_to_inventory(character: &CharacterEntity) | ||||
|                                -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem) | ||||
|                                                   -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), TriggerCreateItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -84,28 +80,8 @@ fn add_floor_item_to_inventory(character: &CharacterEntity) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn pick_up_item<EG>( | ||||
|     item_state: &mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId) | ||||
|     -> Result<TriggerCreateItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_floor(character.id, *item_id)) | ||||
|             .act(add_floor_item_to_inventory(character)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn take_item_from_inventory(character_id: CharacterEntityId, item_id: ClientItemId, amount: u32) | ||||
| pub(super) fn take_item_from_inventory(character_id: CharacterEntityId, item_id: ClientItemId, amount: u32) | ||||
|                             -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                                -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -123,7 +99,7 @@ fn take_item_from_inventory(character_id: CharacterEntityId, item_id: ClientItem | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn add_inventory_item_to_shared_floor(character_id: CharacterEntityId, map_area: MapArea, drop_position: (f32, f32, f32)) | ||||
| pub(super) fn add_inventory_item_to_shared_floor(character_id: CharacterEntityId, map_area: MapArea, drop_position: (f32, f32, f32)) | ||||
|                                   -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                                      -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -150,55 +126,8 @@ fn add_inventory_item_to_shared_floor(character_id: CharacterEntityId, map_area: | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn drop_item<EG>( | ||||
|     item_state: &mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32, f32)) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, *item_id, 0)) | ||||
|             .act(add_inventory_item_to_shared_floor(character.id, map_area, drop_position)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| pub async fn drop_partial_item<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32), | ||||
|     amount: u32) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(add_inventory_item_to_shared_floor(character.id, map_area, (drop_position.0, 0.0, drop_position.1))) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn take_meseta_from_inventory(character_id: CharacterEntityId, amount: u32) | ||||
| pub(super) fn take_meseta_from_inventory(character_id: CharacterEntityId, amount: u32) | ||||
|                               -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                                  -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -214,7 +143,7 @@ fn take_meseta_from_inventory(character_id: CharacterEntityId, amount: u32) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_meseta_to_inventory(character_id: CharacterEntityId, amount: u32) | ||||
| pub(super) fn add_meseta_to_inventory(character_id: CharacterEntityId, amount: u32) | ||||
|                               -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                                  -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -230,7 +159,7 @@ fn add_meseta_to_inventory(character_id: CharacterEntityId, amount: u32) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_meseta_to_shared_floor(character_id: CharacterEntityId, amount: u32, map_area: MapArea, drop_position: (f32, f32)) | ||||
| pub(super) fn add_meseta_to_shared_floor(character_id: CharacterEntityId, amount: u32, map_area: MapArea, drop_position: (f32, f32)) | ||||
|                               -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                                  -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -255,31 +184,7 @@ fn add_meseta_to_shared_floor(character_id: CharacterEntityId, amount: u32, map_ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn drop_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32), | ||||
|     amount: u32) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(character.id, amount)) | ||||
|             .act(add_meseta_to_shared_floor(character.id, amount, map_area, drop_position)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn take_meseta_from_bank(character_id: CharacterEntityId, amount: u32) | ||||
| pub(super) fn take_meseta_from_bank(character_id: CharacterEntityId, amount: u32) | ||||
|                          -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                             -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -294,7 +199,7 @@ fn take_meseta_from_bank(character_id: CharacterEntityId, amount: u32) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_meseta_from_bank_to_inventory(character_id: CharacterEntityId, amount: u32) | ||||
| pub(super) fn add_meseta_from_bank_to_inventory(character_id: CharacterEntityId, amount: u32) | ||||
|                          -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                             -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -310,28 +215,7 @@ fn add_meseta_from_bank_to_inventory(character_id: CharacterEntityId, amount: u3 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn withdraw_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_bank(character.id, amount)) | ||||
|             .act(add_meseta_from_bank_to_inventory(character.id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn add_meseta_to_bank(character_id: CharacterEntityId, amount: u32) | ||||
| pub(super) fn add_meseta_to_bank(character_id: CharacterEntityId, amount: u32) | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -346,28 +230,8 @@ fn add_meseta_to_bank(character_id: CharacterEntityId, amount: u32) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn deposit_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(character.id, amount)) | ||||
|             .act(add_meseta_to_bank(character.id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn take_item_from_bank(character_id: CharacterEntityId, item_id: ClientItemId, amount: u32) | ||||
| pub(super) fn take_item_from_bank(character_id: CharacterEntityId, item_id: ClientItemId, amount: u32) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                                -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), BankItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -383,7 +247,7 @@ fn take_item_from_bank(character_id: CharacterEntityId, item_id: ClientItemId, a | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_bank_item_to_inventory(character: &CharacterEntity) | ||||
| pub(super) fn add_bank_item_to_inventory(character: &CharacterEntity) | ||||
|                               -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), BankItem) | ||||
|                                                  -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -429,31 +293,8 @@ fn add_bank_item_to_inventory(character: &CharacterEntity) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn withdraw_item<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32) | ||||
|     -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_bank(character.id, *item_id, amount)) | ||||
|             //.act(bank_item_to_inventory_item)
 | ||||
|             //.act(add_item_to_inventory)
 | ||||
|             .act(add_bank_item_to_inventory(character)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn add_inventory_item_to_bank(character_id: CharacterEntityId) | ||||
| pub(super) fn add_inventory_item_to_bank(character_id: CharacterEntityId) | ||||
|                               -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                                  -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -482,29 +323,8 @@ fn add_inventory_item_to_bank(character_id: CharacterEntityId) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn deposit_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(add_inventory_item_to_bank(character.id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn equip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId, equip_slot: u8) | ||||
| pub(super) fn equip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId, equip_slot: u8) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                            -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -520,29 +340,8 @@ fn equip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn equip_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     equip_slot: u8, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(equip_inventory_item(character.id, *item_id, equip_slot)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn unequip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId) | ||||
| pub(super) fn unequip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId) | ||||
|                           -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                              -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -558,28 +357,9 @@ fn unequip_inventory_item(character_id: CharacterEntityId, item_id: ClientItemId | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn unequip_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(unequip_inventory_item(character.id, *item_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn sort_inventory_items(character_id: CharacterEntityId, item_ids: Vec<ClientItemId>) | ||||
| pub(super) fn sort_inventory_items(character_id: CharacterEntityId, item_ids: Vec<ClientItemId>) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                            -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -596,28 +376,8 @@ fn sort_inventory_items(character_id: CharacterEntityId, item_ids: Vec<ClientIte | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn sort_inventory<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_ids: Vec<ClientItemId>, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(sort_inventory_items(character.id, item_ids)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn use_consumed_item(character: CharacterEntity) | ||||
| pub(super) fn use_consumed_item(character: CharacterEntity) | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), CharacterEntity), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -637,30 +397,8 @@ fn use_consumed_item(character: CharacterEntity) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn use_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &mut CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), new_character) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(use_consumed_item(character.clone())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         *character = new_character; | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn feed_mag_item(character: CharacterEntity, mag_item_id: ClientItemId) | ||||
| pub(super) fn feed_mag_item(character: CharacterEntity, mag_item_id: ClientItemId) | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), CharacterEntity), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -707,30 +445,7 @@ fn feed_mag_item(character: CharacterEntity, mag_item_id: ClientItemId) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn feed_mag<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     mag_item_id: &ClientItemId, | ||||
|     tool_item_id: &ClientItemId, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, *tool_item_id, 1)) | ||||
|             .act(feed_mag_item(character.clone(), *mag_item_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn add_bought_item_to_inventory<'a>(character_id: CharacterEntityId, | ||||
| pub(super) fn add_bought_item_to_inventory<'a>(character_id: CharacterEntityId, | ||||
|                                     shop_item: &'a (dyn ShopItem + Send + Sync), | ||||
|                                     item_id: ClientItemId, | ||||
|                                     amount: u32) | ||||
| @ -790,34 +505,8 @@ fn add_bought_item_to_inventory<'a>(character_id: CharacterEntityId, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn buy_shop_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     shop_item: &'a (dyn ShopItem + Send + Sync), | ||||
|     item_id: ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     let item_price = shop_item.price() as u32 * amount; | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(character.id, item_price)) | ||||
|             //.act(bought_item_to_inventory_item)
 | ||||
|             //.act(add_item_to_inventory)
 | ||||
|             .act(add_bought_item_to_inventory(character.id, shop_item, item_id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn sell_inventory_item<'a>(character_id: CharacterEntityId) | ||||
| pub(super) fn sell_inventory_item<'a>(character_id: CharacterEntityId) | ||||
|                            -> impl Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                       -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -839,27 +528,6 @@ fn sell_inventory_item<'a>(character_id: CharacterEntityId) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn sell_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, item_id, amount)) | ||||
|             .act(sell_inventory_item(character.id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| #[async_recursion::async_recursion] | ||||
| async fn iterate_inner<'a, I, O, T, F, FR>(state: (ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), | ||||
| @ -890,7 +558,7 @@ where | ||||
|     Ok((state, output)) | ||||
| } | ||||
| 
 | ||||
| pub fn iterate<'k, I, O, T, F, FR>( | ||||
| pub(super) fn iterate<'k, I, O, T, F, FR>( | ||||
|     input: Vec<I>, | ||||
|     func: F) | ||||
|     -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), T) | ||||
| @ -942,7 +610,7 @@ where | ||||
|     Ok((state, output)) | ||||
| } | ||||
| 
 | ||||
| pub fn foreach<'k, O, T, F>(func: F) | ||||
| pub(super) fn foreach<'k, O, T, F>(func: F) | ||||
|                                 -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), Vec<T>) | ||||
|                                                    -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), Vec<O>), ItemStateError>> + Send + 'a>> | ||||
| where | ||||
| @ -963,7 +631,7 @@ where | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn insert<'a, T: Send + Clone + 'a>(element: T) | ||||
| pub(super) fn insert<'a, T: Send + Clone + 'a>(element: T) | ||||
|          -> impl Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                             -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), T), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -975,7 +643,7 @@ fn insert<'a, T: Send + Clone + 'a>(element: T) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_item_to_inventory(character: CharacterEntity) | ||||
| pub(super) fn add_item_to_inventory(character: CharacterEntity) | ||||
|                          -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                             -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> + Clone | ||||
| { | ||||
| @ -999,7 +667,7 @@ fn add_item_to_inventory(character: CharacterEntity) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn record_trade(trade_id: TradeId, character_to: CharacterEntityId, character_from: CharacterEntityId) | ||||
| pub(super) fn record_trade(trade_id: TradeId, character_to: CharacterEntityId, character_from: CharacterEntityId) | ||||
|                 -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), Vec<InventoryItem>) | ||||
|                                    -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), Vec<InventoryItem>), ItemStateError>> + Send + 'a>> + Clone | ||||
| { | ||||
| @ -1022,7 +690,7 @@ fn record_trade(trade_id: TradeId, character_to: CharacterEntityId, character_fr | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn assign_new_item_id() | ||||
| pub(super) fn assign_new_item_id() | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> + Clone | ||||
| { | ||||
| @ -1034,98 +702,8 @@ fn assign_new_item_id() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn trade_items<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     p1: (&AreaClient, &CharacterEntity, &Vec<TradeItem>, Meseta), | ||||
|     p2: (&AreaClient, &CharacterEntity, &Vec<TradeItem>, Meseta)) | ||||
|     -> Result<(Vec<InventoryItem>, Vec<InventoryItem>), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     let p1_trade_items = p1.2 | ||||
|         .iter() | ||||
|         .map(|item| { | ||||
|             match item { | ||||
|                 TradeItem::Individual(item_id) => (*item_id, 1), | ||||
|                 TradeItem::Stacked(item_id, amount) => (*item_id, *amount as u32), | ||||
|             } | ||||
|         }) | ||||
|         .collect(); | ||||
|     let p2_trade_items = p2.2 | ||||
|         .iter() | ||||
|         .map(|item| { | ||||
|             match item { | ||||
|                 TradeItem::Individual(item_id) => (*item_id, 1), | ||||
|                 TradeItem::Stacked(item_id, amount) => (*item_id, *amount as u32), | ||||
|             } | ||||
|         }) | ||||
|         .collect(); | ||||
|     entity_gateway.with_transaction(|mut transaction| async move { | ||||
|         let p1_id = p1.1.id; | ||||
|         let p2_id = p2.1.id; | ||||
|         let trade = transaction.gateway().create_trade(&p1_id, &p2_id).await?; | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), p1_removed_items) = ItemStateAction::default() | ||||
|             .act(iterate(p1_trade_items, move |p1_trade_item| take_item_from_inventory(p1_id, p1_trade_item.0, p1_trade_item.1) )) | ||||
|             .act(foreach(assign_new_item_id())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         let ((item_state_proxy, transaction), p2_removed_items) = ItemStateAction::default() | ||||
|             .act(iterate(p2_trade_items, move |p2_trade_item| take_item_from_inventory(p2_id, p2_trade_item.0, p2_trade_item.1) )) | ||||
|             .act(foreach(assign_new_item_id())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|         let ((item_state_proxy, transaction), p2_new_items) = ItemStateAction::default() | ||||
|             .act(insert(p1_removed_items)) | ||||
|             .act(foreach(add_item_to_inventory(p2.1.clone()))) | ||||
|             .act(record_trade(trade.id, p1_id, p2_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         let ((item_state_proxy, transaction), p1_new_items) = ItemStateAction::default() | ||||
|             .act(insert(p2_removed_items)) | ||||
|             .act(foreach(add_item_to_inventory(p1.1.clone()))) | ||||
|             .act(record_trade(trade.id, p2_id, p1_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(p1_id, p1.3.0)) | ||||
|             .act(take_meseta_from_inventory(p2_id, p2.3.0)) | ||||
|             .act(add_meseta_to_inventory(p1_id, p2.3.0)) | ||||
|             .act(add_meseta_to_inventory(p2_id, p1.3.0)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, (p1_new_items, p2_new_items))) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn take_meseta<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character_id: &CharacterEntityId, | ||||
|     meseta: Meseta) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(*character_id, meseta.0)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn convert_item_drop_to_floor_item(character_id: CharacterEntityId, item_drop: ItemDrop) | ||||
| pub(super) fn convert_item_drop_to_floor_item(character_id: CharacterEntityId, item_drop: ItemDrop) | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), ()) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem), ItemStateError>> + Send + 'a>> + Clone | ||||
| { | ||||
| @ -1222,7 +800,7 @@ fn convert_item_drop_to_floor_item(character_id: CharacterEntityId, item_drop: I | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn add_item_to_local_floor(character_id: CharacterEntityId) | ||||
| pub(super) fn add_item_to_local_floor(character_id: CharacterEntityId) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem) | ||||
|                                            -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), FloorItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -1237,29 +815,7 @@ fn add_item_to_local_floor(character_id: CharacterEntityId) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub async fn enemy_drops_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character_id: CharacterEntityId, | ||||
|     item_drop: ItemDrop) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), floor_item) = ItemStateAction::default() | ||||
|             .act(convert_item_drop_to_floor_item(character_id, item_drop)) | ||||
|             .act(add_item_to_local_floor(character_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, floor_item)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| fn apply_modifier_to_inventory_item(modifier: ItemModifier) | ||||
| pub(super) fn apply_modifier_to_inventory_item(modifier: ItemModifier) | ||||
|                         -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                            -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -1279,7 +835,7 @@ fn apply_modifier_to_inventory_item(modifier: ItemModifier) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn as_individual_item() | ||||
| pub(super) fn as_individual_item() | ||||
|                       -> impl for<'a> Fn((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), InventoryItem) | ||||
|                                          -> Pin<Box<dyn Future<Output=Result<((ItemStateProxy<'a>, Box<dyn EntityGatewayTransaction + 'a>), IndividualItemDetail), ItemStateError>> + Send + 'a>> | ||||
| { | ||||
| @ -1294,29 +850,3 @@ fn as_individual_item() | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn apply_modifier<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: ClientItemId, | ||||
|     modifier: ItemModifier) | ||||
|     -> Result<IndividualItemDetail, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), item) = ItemStateAction::default() | ||||
|             .act(take_item_from_inventory(character.id, item_id, 1)) | ||||
|             .act(apply_modifier_to_inventory_item(modifier)) | ||||
|             .act(add_item_to_inventory(character.clone())) | ||||
|             .act(as_individual_item()) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, item)) | ||||
|     }).await | ||||
| } | ||||
|  | ||||
| @ -5,6 +5,7 @@ pub mod itemstateaction; | ||||
| pub mod inventory; | ||||
| pub mod floor; | ||||
| pub mod bank; | ||||
| pub mod tasks; | ||||
| 
 | ||||
| #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, serde::Serialize, serde::Deserialize, derive_more::Display)] | ||||
| pub struct ClientItemId(pub u32); | ||||
|  | ||||
| @ -14,8 +14,6 @@ use crate::ship::items::inventory::{Inventory, InventoryItem, InventoryItemDetai | ||||
| use crate::ship::items::floor::{FloorState, FloorItem, LocalFloor, SharedFloor, FloorType}; | ||||
| use crate::ship::items::bank::{Bank, BankState, BankItem, BankItemDetail, BankError}; | ||||
| 
 | ||||
| // TODO: Commit trait that ItemStateProxy and EntityTransaction implement that .commit requires and acts on upon everything succeeding (like 3 less lines of code!)
 | ||||
| 
 | ||||
| #[derive(thiserror::Error, Debug)] | ||||
| pub enum ItemStateError { | ||||
|     #[error("character {0} not found")] | ||||
|  | ||||
							
								
								
									
										500
									
								
								src/ship/items/tasks.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										500
									
								
								src/ship/items/tasks.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,500 @@ | ||||
| use crate::ship::items::ClientItemId; | ||||
| use crate::entity::item::Meseta; | ||||
| 
 | ||||
| use crate::ship::map::MapArea; | ||||
| use crate::entity::character::{CharacterEntity, CharacterEntityId}; | ||||
| use crate::entity::gateway::EntityGateway; | ||||
| use crate::ship::items::state::{ItemState, ItemStateProxy, ItemStateError, IndividualItemDetail}; | ||||
| use crate::ship::items::itemstateaction::{ItemStateAction, ItemAction}; | ||||
| use crate::ship::items::inventory::InventoryItem; | ||||
| use crate::ship::items::floor::FloorItem; | ||||
| use crate::entity::item::ItemModifier; | ||||
| use crate::ship::shops::ShopItem; | ||||
| use crate::ship::trade::TradeItem; | ||||
| use crate::ship::location::AreaClient; | ||||
| use crate::ship::drops::ItemDrop; | ||||
| 
 | ||||
| use crate::ship::items::actions; | ||||
| 
 | ||||
| pub async fn pick_up_item<EG>( | ||||
|     item_state: &mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId) | ||||
|     -> Result<actions::TriggerCreateItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_floor(character.id, *item_id)) | ||||
|             .act(actions::add_floor_item_to_inventory(character)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| pub async fn drop_item<EG>( | ||||
|     item_state: &mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32, f32)) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, *item_id, 0)) | ||||
|             .act(actions::add_inventory_item_to_shared_floor(character.id, map_area, drop_position)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| pub async fn drop_partial_item<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32), | ||||
|     amount: u32) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(actions::add_inventory_item_to_shared_floor(character.id, map_area, (drop_position.0, 0.0, drop_position.1))) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| pub async fn drop_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     map_area: MapArea, | ||||
|     drop_position: (f32, f32), | ||||
|     amount: u32) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_inventory(character.id, amount)) | ||||
|             .act(actions::add_meseta_to_shared_floor(character.id, amount, map_area, drop_position)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn withdraw_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_bank(character.id, amount)) | ||||
|             .act(actions::add_meseta_from_bank_to_inventory(character.id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn deposit_meseta<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_inventory(character.id, amount)) | ||||
|             .act(actions::add_meseta_to_bank(character.id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn withdraw_item<'a, EG>( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32) | ||||
|     -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_bank(character.id, *item_id, amount)) | ||||
|             //.act(bank_item_to_inventory_item)
 | ||||
|             //.act(add_item_to_inventory)
 | ||||
|             .act(actions::add_bank_item_to_inventory(character)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn deposit_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(actions::add_inventory_item_to_bank(character.id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| pub async fn equip_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     equip_slot: u8, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::equip_inventory_item(character.id, *item_id, equip_slot)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn unequip_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::unequip_inventory_item(character.id, *item_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn sort_inventory<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_ids: Vec<ClientItemId>, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::sort_inventory_items(character.id, item_ids)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn use_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &mut CharacterEntity, | ||||
|     item_id: &ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), new_character) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, *item_id, amount)) | ||||
|             .act(actions::use_consumed_item(character.clone())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         *character = new_character; | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn feed_mag<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     mag_item_id: &ClientItemId, | ||||
|     tool_item_id: &ClientItemId, | ||||
| ) -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, *tool_item_id, 1)) | ||||
|             .act(actions::feed_mag_item(character.clone(), *mag_item_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn buy_shop_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     shop_item: &'a (dyn ShopItem + Send + Sync), | ||||
|     item_id: ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     let item_price = shop_item.price() as u32 * amount; | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_inventory(character.id, item_price)) | ||||
|             //.act(bought_item_to_inventory_item)
 | ||||
|             //.act(add_item_to_inventory)
 | ||||
|             .act(actions::add_bought_item_to_inventory(character.id, shop_item, item_id, amount)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn sell_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: ClientItemId, | ||||
|     amount: u32, | ||||
| ) -> Result<InventoryItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), result) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, item_id, amount)) | ||||
|             .act(actions::sell_inventory_item(character.id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         item_state_proxy.commit(); | ||||
|         Ok((transaction, result)) | ||||
|     }).await | ||||
| } | ||||
| pub async fn trade_items<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     p1: (&AreaClient, &CharacterEntity, &Vec<TradeItem>, Meseta), | ||||
|     p2: (&AreaClient, &CharacterEntity, &Vec<TradeItem>, Meseta)) | ||||
|     -> Result<(Vec<InventoryItem>, Vec<InventoryItem>), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     let p1_trade_items = p1.2 | ||||
|         .iter() | ||||
|         .map(|item| { | ||||
|             match item { | ||||
|                 TradeItem::Individual(item_id) => (*item_id, 1), | ||||
|                 TradeItem::Stacked(item_id, amount) => (*item_id, *amount as u32), | ||||
|             } | ||||
|         }) | ||||
|         .collect(); | ||||
|     let p2_trade_items = p2.2 | ||||
|         .iter() | ||||
|         .map(|item| { | ||||
|             match item { | ||||
|                 TradeItem::Individual(item_id) => (*item_id, 1), | ||||
|                 TradeItem::Stacked(item_id, amount) => (*item_id, *amount as u32), | ||||
|             } | ||||
|         }) | ||||
|         .collect(); | ||||
|     entity_gateway.with_transaction(|mut transaction| async move { | ||||
|         let p1_id = p1.1.id; | ||||
|         let p2_id = p2.1.id; | ||||
|         let trade = transaction.gateway().create_trade(&p1_id, &p2_id).await?; | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), p1_removed_items) = ItemStateAction::default() | ||||
|             .act(actions::iterate(p1_trade_items, move |p1_trade_item| actions::take_item_from_inventory(p1_id, p1_trade_item.0, p1_trade_item.1) )) | ||||
|             .act(actions::foreach(actions::assign_new_item_id())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         let ((item_state_proxy, transaction), p2_removed_items) = ItemStateAction::default() | ||||
|             .act(actions::iterate(p2_trade_items, move |p2_trade_item| actions::take_item_from_inventory(p2_id, p2_trade_item.0, p2_trade_item.1) )) | ||||
|             .act(actions::foreach(actions::assign_new_item_id())) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|         let ((item_state_proxy, transaction), p2_new_items) = ItemStateAction::default() | ||||
|             .act(actions::insert(p1_removed_items)) | ||||
|             .act(actions::foreach(actions::add_item_to_inventory(p2.1.clone()))) | ||||
|             .act(actions::record_trade(trade.id, p1_id, p2_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
|         let ((item_state_proxy, transaction), p1_new_items) = ItemStateAction::default() | ||||
|             .act(actions::insert(p2_removed_items)) | ||||
|             .act(actions::foreach(actions::add_item_to_inventory(p1.1.clone()))) | ||||
|             .act(actions::record_trade(trade.id, p2_id, p1_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_inventory(p1_id, p1.3.0)) | ||||
|             .act(actions::take_meseta_from_inventory(p2_id, p2.3.0)) | ||||
|             .act(actions::add_meseta_to_inventory(p1_id, p2.3.0)) | ||||
|             .act(actions::add_meseta_to_inventory(p2_id, p1.3.0)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, (p1_new_items, p2_new_items))) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn take_meseta<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character_id: &CharacterEntityId, | ||||
|     meseta: Meseta) | ||||
|     -> Result<(), ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), _) = ItemStateAction::default() | ||||
|             .act(actions::take_meseta_from_inventory(*character_id, meseta.0)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| pub async fn enemy_drops_item<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character_id: CharacterEntityId, | ||||
|     item_drop: ItemDrop) | ||||
|     -> Result<FloorItem, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), floor_item) = ItemStateAction::default() | ||||
|             .act(actions::convert_item_drop_to_floor_item(character_id, item_drop)) | ||||
|             .act(actions::add_item_to_local_floor(character_id)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, floor_item)) | ||||
|     }).await | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pub async fn apply_modifier<'a, EG> ( | ||||
|     item_state: &'a mut ItemState, | ||||
|     entity_gateway: &mut EG, | ||||
|     character: &CharacterEntity, | ||||
|     item_id: ClientItemId, | ||||
|     modifier: ItemModifier) | ||||
|     -> Result<IndividualItemDetail, ItemStateError> | ||||
| where | ||||
|     EG: EntityGateway, | ||||
| { | ||||
|     entity_gateway.with_transaction(|transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), item) = ItemStateAction::default() | ||||
|             .act(actions::take_item_from_inventory(character.id, item_id, 1)) | ||||
|             .act(actions::apply_modifier_to_inventory_item(modifier)) | ||||
|             .act(actions::add_item_to_inventory(character.clone())) | ||||
|             .act(actions::as_individual_item()) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, item)) | ||||
|     }).await | ||||
| } | ||||
| @ -16,7 +16,8 @@ use crate::ship::packet::builder; | ||||
| use crate::ship::shops::{ShopItem, ToolShopItem, ArmorShopItem}; | ||||
| use crate::ship::items::state::{ItemState, ItemStateError}; | ||||
| use crate::ship::items::floor::{FloorType, FloorItemDetail}; | ||||
| use crate::ship::items::actions::{pick_up_item, withdraw_meseta, deposit_meseta, withdraw_item, deposit_item, buy_shop_item, enemy_drops_item, take_meseta, apply_modifier, TriggerCreateItem}; | ||||
| use crate::ship::items::actions::TriggerCreateItem; | ||||
| use crate::ship::items::tasks::{pick_up_item, withdraw_meseta, deposit_meseta, withdraw_item, deposit_item, buy_shop_item, enemy_drops_item, take_meseta, apply_modifier}; | ||||
| 
 | ||||
| const BANK_ACTION_DEPOSIT: u8 = 0; | ||||
| const BANK_ACTION_WITHDRAW: u8 = 1; | ||||
|  | ||||
| @ -9,7 +9,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::actions::{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}; | ||||
| 
 | ||||
| pub async fn request_exp<EG: EntityGateway>(id: ClientId, | ||||
|                                             request_exp: &RequestExp, | ||||
|  | ||||
| @ -10,7 +10,7 @@ use crate::ship::items::inventory::InventoryItemDetail; | ||||
| use crate::ship::trade::{TradeItem, TradeState, TradeStatus}; | ||||
| use crate::entity::gateway::EntityGateway; | ||||
| use crate::ship::packet::builder; | ||||
| use crate::ship::items::actions::trade_items; | ||||
| use crate::ship::items::tasks::trade_items; | ||||
| use crate::ship::location::{AreaClient, RoomId}; | ||||
| use crate::entity::item::Meseta; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user