use crate::fixed_types::FixedString;
use super::{HelperReadWrite, PacketReadWrite};
use std::time::Duration;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x18, 0x14)]
pub struct FriendListRequestPacket {
pub unk: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x18, 0x15)]
#[Flags(Flags::PACKED)]
#[Magic(0x2E1E, 0x63)]
pub struct FriendListPacket {
pub unk1: u32,
pub unk2: u16,
pub unk3: u16,
pub friends: Vec<FriendListEntry>,
pub nickname: String,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x18, 0x18)]
#[Flags(Flags::PACKED)]
#[Magic(0xBF57, 0x44)]
pub struct SendFriendRequestPacket {
pub id: u32,
#[Seek(4)]
pub msg: String,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x18, 0x1A)]
pub struct AddedRequestPacket {
pub unk1: u32,
pub sender_id: u32,
#[Seek(4)]
pub target_id: u32,
#[Seek(4)]
pub sender_nickname: FixedString<0x22>,
pub target_nickname: FixedString<0x22>,
pub msg: FixedString<0x80>,
pub send_time: Duration,
#[Seek(0x88)]
pub unk2: u8,
pub unk3: u8,
#[SeekAfter(0x91)]
pub unk4: u8,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, HelperReadWrite)]
pub struct FriendListEntry {
pub id: u32,
#[Seek(4)]
pub nickname: FixedString<0x20>,
#[Seek(4)]
pub char_name: FixedString<0x10>,
#[Seek(4)]
pub flags: FriendFlags,
pub unk2: u8,
pub unk3: u8,
pub unk4: u8,
#[Seek(4)]
pub unk5: u32,
#[Seek(8)]
pub blockid: u32,
pub location: FriendLocation,
pub unk6: u16,
pub unk7: u32,
pub alliance_name: FixedString<0x18>,
#[Seek(0x8)]
pub unk8: Duration,
pub unk9: Duration,
#[Seek(0x38)]
pub unk10: u32,
#[Seek(4)]
pub unk11: u8,
pub unk12: u8,
#[Seek(2)]
#[SeekAfter(4)]
pub unk13: Duration,
}
bitflags::bitflags! {
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Copy, Clone, Default, PartialEq, HelperReadWrite)]
#[BitFlags(u8)]
pub struct FriendFlags: u8 {
const IS_ONLINE = 1 << 0;
const LOGIN_NOTIF = 1 << 3;
const NO_RECENT_LOGINS = 1 << 5;
const _ = !0;
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u16)]
#[derive(Debug, Copy, Clone, Default, PartialEq, HelperReadWrite)]
pub enum FriendLocation {
#[default]
Lobby,
Quest,
PersonalQ,
AllianceQ,
Casino,
ChallengerLobby,
Bridge,
FrancasCafe,
BattleLobby,
#[Read_default]
Unknown = 0xFFFF,
}