fix some meseta-taking things
This commit is contained in:
		
							parent
							
								
									6631468871
								
							
						
					
					
						commit
						2a7b43df83
					
				| @ -1123,3 +1123,25 @@ where | ||||
|         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(|mut transaction| async move { | ||||
|         let item_state_proxy = ItemStateProxy::new(item_state); | ||||
|         let ((item_state_proxy, transaction), p1_removed_items) = ItemStateAction::default() | ||||
|             .act(take_meseta_from_inventory(*character_id, meseta.0)) | ||||
|             .commit((item_state_proxy, transaction)) | ||||
|             .await?; | ||||
| 
 | ||||
|             item_state_proxy.commit(); | ||||
|         Ok((transaction, ())) | ||||
|     }).await | ||||
| } | ||||
|  | ||||
| @ -1,14 +1,15 @@ | ||||
| use libpso::packet::ship::*; | ||||
| use libpso::packet::messages::*; | ||||
| use crate::entity::gateway::EntityGateway; | ||||
| use crate::entity::item::Meseta; | ||||
| 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::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}; | ||||
| 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}; | ||||
| 
 | ||||
| pub async fn request_exp<EG: EntityGateway>(id: ClientId, | ||||
|                                             request_exp: &RequestExp, | ||||
| @ -257,25 +258,25 @@ pub fn update_player_position(id: ClientId, | ||||
| } | ||||
| 
 | ||||
| pub async fn charge_attack<EG>(id: ClientId, | ||||
|                         charge: &ChargeAttack, | ||||
|                         clients: &mut Clients, | ||||
|                         entity_gateway: &mut EG, | ||||
|                         item_manager: &mut ItemManager) | ||||
|                         -> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, anyhow::Error> | ||||
|                                charge: &ChargeAttack, | ||||
|                                entity_gateway: &mut EG, | ||||
|                                client_location: &ClientLocation, | ||||
|                                clients: &mut Clients, | ||||
|                                item_state: &mut ItemState) | ||||
|                                -> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, anyhow::Error> | ||||
| where | ||||
|     EG: EntityGateway | ||||
| { | ||||
|     let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?; | ||||
|     let meseta = item_manager.get_character_meseta_mut(&client.character.id)?; | ||||
| 
 | ||||
|     if meseta.0 >= charge.meseta { | ||||
|         meseta.0 -= charge.meseta; | ||||
|         entity_gateway.set_character_meseta(&client.character.id, *meseta).await?; | ||||
|         // TODO: this should probably echo the packet
 | ||||
|         Ok(Box::new(None.into_iter())) | ||||
|     } else { | ||||
|         Err(ShipError::NotEnoughMeseta(id, meseta.0).into()) | ||||
|     } | ||||
|     // TODO: should probably validate this to be a legit number, I'd just hardcode 200 but vjaya
 | ||||
|     take_meseta(item_state, entity_gateway, &client.character.id, Meseta(charge.meseta)).await?; | ||||
| 
 | ||||
|     let charge = charge.clone(); | ||||
|     Ok(Box::new(client_location.get_client_neighbors(id).unwrap().into_iter() | ||||
|                     .map(move |client| { | ||||
|                         (client.client, SendShipPacket::Message(Message::new(GameMessage::ChargeAttack(charge.clone())))) | ||||
|                     }))) | ||||
| } | ||||
| 
 | ||||
| pub async fn player_uses_item<EG>(id: ClientId, | ||||
| @ -294,24 +295,24 @@ where | ||||
| } | ||||
| 
 | ||||
| pub async fn player_used_medical_center<EG>(id: ClientId, | ||||
|                                             _pumc: &PlayerUsedMedicalCenter, // not needed?
 | ||||
|                                             pumc: &PlayerUsedMedicalCenter, | ||||
|                                             entity_gateway: &mut EG, | ||||
|                                             client_location: &ClientLocation, | ||||
|                                             clients: &mut Clients, | ||||
|                                             item_manager: &mut ItemManager) | ||||
|                                             item_state: &mut ItemState) | ||||
|                                             -> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, anyhow::Error> | ||||
| where | ||||
|     EG: EntityGateway | ||||
| { | ||||
|     let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?; | ||||
|     let meseta = item_manager.get_character_meseta_mut(&client.character.id)?; | ||||
|     if meseta.0 >= 10 { | ||||
|         meseta.0 -= 10; | ||||
|         entity_gateway.set_character_meseta(&client.character.id, *meseta).await?; | ||||
|         // TODO: this should probably echo the packet
 | ||||
|         Ok(Box::new(None.into_iter())) | ||||
|     } else { | ||||
|         Err(ShipError::NotEnoughMeseta(id, meseta.0).into()) | ||||
|     } | ||||
| 
 | ||||
|     take_meseta(item_state, entity_gateway, &client.character.id, Meseta(10)).await?; | ||||
| 
 | ||||
|     let pumc = pumc.clone(); | ||||
|     Ok(Box::new(client_location.get_client_neighbors(id).unwrap().into_iter() | ||||
|                     .map(move |client| { | ||||
|                         (client.client, SendShipPacket::Message(Message::new(GameMessage::PlayerUsedMedicalCenter(pumc.clone())))) | ||||
|                     }))) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -500,14 +500,16 @@ impl<EG: EntityGateway> ShipServerState<EG> { | ||||
|                 handler::message::update_player_position(id, msg, &mut self.clients, &block.client_location, &block.rooms)? | ||||
|             }, | ||||
|             GameMessage::ChargeAttack(charge_attack) => { | ||||
|                 handler::message::charge_attack(id, charge_attack, &mut self.clients, &mut self.entity_gateway, &mut self.item_manager).await? | ||||
|                 let block = self.blocks.with_client(id, &self.clients)?; | ||||
|                 handler::message::charge_attack(id, charge_attack, &mut self.entity_gateway, &block.client_location, &mut self.clients, &mut self.item_state).await? | ||||
|             }, | ||||
|             GameMessage::PlayerUseItem(player_use_item) => { | ||||
|                 let block = self.blocks.with_client(id, &self.clients)?; | ||||
|                 handler::message::player_uses_item(id, player_use_item, &mut self.entity_gateway, &block.client_location, &mut self.clients, &mut self.item_state).await? | ||||
|             }, | ||||
|             GameMessage::PlayerUsedMedicalCenter(player_used_medical_center) => { | ||||
|                 handler::message::player_used_medical_center(id, player_used_medical_center, &mut self.entity_gateway, &mut self.clients, &mut self.item_manager).await? | ||||
|                 let block = self.blocks.with_client(id, &self.clients)?; | ||||
|                 handler::message::player_used_medical_center(id, player_used_medical_center, &mut self.entity_gateway, &block.client_location, &mut self.clients, &mut self.item_state).await? | ||||
|             }, | ||||
|             GameMessage::PlayerFeedMag(player_feed_mag) => { | ||||
|                 let block = self.blocks.with_client(id, &self.clients)?; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user