Merge pull request 'properly define TradeRequest' (#13) from traderequest into master
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			Reviewed-on: #13
This commit is contained in:
		
						commit
						564a1ce165
					
				| @ -1,5 +1,6 @@ | ||||
| #![allow(unused_must_use)] | ||||
| use std::io::{SeekFrom}; | ||||
| use std::convert::TryInto; | ||||
| 
 | ||||
| use psopacket::{pso_message, PSOPacketData}; | ||||
| use crate::{PSOPacketData, PacketParseError}; | ||||
| @ -684,11 +685,122 @@ pub struct BoxDropRequest { | ||||
| 
 | ||||
| //}
 | ||||
| 
 | ||||
| 
 | ||||
| #[derive(Clone, Debug, PartialEq)] | ||||
| pub enum TradeRequestInitializeCommand { | ||||
|     Initialize, | ||||
|     Respond, | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #[derive(Clone, Debug, PartialEq)] | ||||
| pub enum TradeRequestCommand { | ||||
|     Initialize(TradeRequestInitializeCommand, u32), | ||||
|     AddItem(u32, u32), | ||||
|     RemoveItem(u32, u32), | ||||
|     Confirm, | ||||
|     FinalConfirm, | ||||
|     Unknown, | ||||
| } | ||||
| 
 | ||||
| impl PSOPacketData for TradeRequestCommand { | ||||
|     fn from_bytes<R: std::io::Read + std::io::Seek>(cursor: &mut R) -> Result<Self, PacketParseError> { | ||||
|         let mut bytes = [0u8; 12]; | ||||
|         let len = cursor.read(&mut bytes).map_err(|_| PacketParseError::ReadError)?; | ||||
|         if len != 12 { | ||||
|             return Err(PacketParseError::NotEnoughBytes); | ||||
|         } | ||||
| 
 | ||||
|         match bytes[0] { | ||||
|             0 => { | ||||
|                 let meseta = u32::from_le_bytes(bytes[8..12].try_into().map_err(|_| PacketParseError::InvalidValue)?); | ||||
|                 match bytes[1] { | ||||
|                     0 => Ok(TradeRequestCommand::Initialize(TradeRequestInitializeCommand::Initialize, meseta)), | ||||
|                     2 => Ok(TradeRequestCommand::Initialize(TradeRequestInitializeCommand::Respond, meseta)), | ||||
|                     _ => Err(PacketParseError::InvalidValue) | ||||
|                 } | ||||
|             }, | ||||
|             1 => { | ||||
|                 Ok(TradeRequestCommand::AddItem( | ||||
|                     u32::from_le_bytes(bytes[4..8].try_into().map_err(|_| PacketParseError::InvalidValue)?), | ||||
|                     u32::from_le_bytes(bytes[8..12].try_into().map_err(|_| PacketParseError::InvalidValue)?), | ||||
|                 )) | ||||
|             }, | ||||
|             2 => { | ||||
|                 Ok(TradeRequestCommand::RemoveItem( | ||||
|                     u32::from_le_bytes(bytes[4..8].try_into().map_err(|_| PacketParseError::InvalidValue)?), | ||||
|                     u32::from_le_bytes(bytes[8..12].try_into().map_err(|_| PacketParseError::InvalidValue)?), | ||||
|                 )) | ||||
|             }, | ||||
|             3 => { | ||||
|                 Ok(TradeRequestCommand::Confirm) | ||||
|             }, | ||||
|             4 => { | ||||
|                 Ok(TradeRequestCommand::FinalConfirm) | ||||
|             }, | ||||
|             6 => { | ||||
|                 Ok(TradeRequestCommand::Unknown) | ||||
|             }, | ||||
|             _ => { | ||||
|                 Err(PacketParseError::InvalidValue) | ||||
|             }, | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     fn as_bytes(&self) -> Vec<u8> { | ||||
|         match self { | ||||
|             TradeRequestCommand::Initialize(cmd, meseta) => { | ||||
|                 vec![0u8, | ||||
|                      match cmd { | ||||
|                          TradeRequestInitializeCommand::Initialize => 0, | ||||
|                          TradeRequestInitializeCommand::Respond => 2, | ||||
|                      }, | ||||
|                      0, 0, | ||||
|                      0, 0, 0, 0] | ||||
|                     .into_iter() | ||||
|                     .chain(meseta.to_le_bytes().to_vec().into_iter()) | ||||
|                     .collect() | ||||
|             }, | ||||
|             TradeRequestCommand::AddItem(item_id, amount) => { | ||||
|                 vec![1u8, 0, 0, 0] | ||||
|                     .into_iter() | ||||
|                     .chain(item_id.to_le_bytes().to_vec().into_iter()) | ||||
|                     .chain(amount.to_le_bytes().to_vec().into_iter()) | ||||
|                     .collect() | ||||
|             }, | ||||
|             TradeRequestCommand::RemoveItem(item_id, amount) => { | ||||
|                 vec![2u8, 0, 0, 0] | ||||
|                     .into_iter() | ||||
|                     .chain(item_id.to_le_bytes().to_vec().into_iter()) | ||||
|                     .chain(amount.to_le_bytes().to_vec().into_iter()) | ||||
|                     .collect() | ||||
|             }, | ||||
|             TradeRequestCommand::Confirm => { | ||||
|                 vec![3u8] | ||||
|                     .into_iter() | ||||
|                     .chain(std::iter::repeat(0).take(11)) | ||||
|                     .collect() | ||||
|             }, | ||||
|             TradeRequestCommand::FinalConfirm => { | ||||
|                 vec![4u8] | ||||
|                     .into_iter() | ||||
|                     .chain(std::iter::repeat(0).take(11)) | ||||
|                     .collect() | ||||
|             }, | ||||
|             TradeRequestCommand::Unknown => { | ||||
|                 vec![6u8] | ||||
|                     .into_iter() | ||||
|                     .chain(std::iter::repeat(0).take(11)) | ||||
|                     .collect() | ||||
|             }, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[pso_message(0xA6)] | ||||
| pub struct TradeRequest { | ||||
|     unknown1: u32, | ||||
|     unknown2: u32, | ||||
|     unknown3: u32, | ||||
|     pub trade: TradeRequestCommand, | ||||
| } | ||||
| 
 | ||||
| //#[pso_message(0xA8)]
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user