properly define TradeRequest #13
| @ -1,5 +1,6 @@ | |||||||
| #![allow(unused_must_use)] | #![allow(unused_must_use)] | ||||||
| use std::io::{SeekFrom}; | use std::io::{SeekFrom}; | ||||||
|  | use std::convert::TryInto; | ||||||
| 
 | 
 | ||||||
| use psopacket::{pso_message, PSOPacketData}; | use psopacket::{pso_message, PSOPacketData}; | ||||||
| use crate::{PSOPacketData, PacketParseError}; | 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)] | #[pso_message(0xA6)] | ||||||
| pub struct TradeRequest { | pub struct TradeRequest { | ||||||
|     unknown1: u32, |     pub trade: TradeRequestCommand, | ||||||
|     unknown2: u32, |  | ||||||
|     unknown3: u32, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //#[pso_message(0xA8)]
 | //#[pso_message(0xA8)]
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user