Browse Source

properly define TradeRequest

pull/13/head
jake 3 years ago
parent
commit
e8ebbb8a4e
  1. 118
      src/packet/messages.rs

118
src/packet/messages.rs

@ -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,
unknown2: u32,
unknown3: u32,
pub trade: TradeRequestCommand,
} }
//#[pso_message(0xA8)] //#[pso_message(0xA8)]

Loading…
Cancel
Save