use crate::{
protocol::{models::character::Class, HelperReadWrite, ObjectHeader, PacketReadWrite},
AsciiString,
};
use super::questlist::{Quest, QuestDifficulty, QuestType};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x00)]
#[Flags(Flags::PACKED)]
#[Magic(0xCCE7, 0x13)]
pub struct AddMemberPacket {
pub new_member: ObjectHeader,
pub color: Color,
#[Seek(3)]
pub level: u32,
pub sublevel: u32,
#[SeekAfter(3)]
pub class: Class,
pub subclass: Class,
pub padding: [u8; 3],
pub nickname: String,
pub char_name: String,
pub unk5: [u8; 0xC],
pub unk6: u16,
pub unk7: [u8; 2],
pub hp: [u32; 3],
pub map_id: u16,
pub unk10: [u8; 4],
pub unk11: u16,
pub unk12: u32,
pub unk13: [u8; 0xC],
pub unk14: [u32; 3],
pub unk15: String,
pub unk16: AsciiString,
#[cfg(feature = "ngs_packets")]
#[cfg_attr(docsrs, doc(cfg(feature = "ngs_packets")))]
#[OnlyOn(PacketType::NGS)]
pub unk17: AsciiString,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x01)]
pub struct RemoveMemberPacket {
pub removed_member: ObjectHeader,
pub receiver: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x02)]
#[Flags(Flags::PACKED)]
#[Magic(0xD863, 0xA9)]
pub struct PartyInitPacket {
pub party_object: ObjectHeader,
pub leader: ObjectHeader,
pub people_amount: u32,
pub entries: [PartyEntry; 4],
pub unk2: AsciiString,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x04)]
pub struct PartyInviteResultPacket {
pub unk1: u32,
pub status: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x05)]
pub struct PartyInviteRequestPacket {
pub invitee: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x06)]
#[Flags(Flags::PACKED)]
#[Magic(0xEF59, 0xD5)]
pub struct NewInvitePacket {
pub party_object: ObjectHeader,
pub inviter: ObjectHeader,
pub name: String,
pub inviter_name: String,
pub questname: String,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x07)]
pub struct AcceptInvitePacket {
pub party_object: ObjectHeader,
pub inviter: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x0C)]
#[Flags(Flags::PACKED)]
#[Magic(0x11CB, 0x98)]
pub struct NewPartySettingsPacket {
pub name: String,
pub password: String,
pub comments: String,
pub questname: String,
pub min_level: u8,
pub max_level: u8,
pub playstyle: u8,
pub flags: PartyFlags,
pub unk: u64,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x0D)]
#[Flags(Flags::PACKED)]
#[Magic(0x9789, 0xE3)]
pub struct PartySettingsPacket {
pub name: String,
pub password: String,
pub comments: String,
pub min_level: u8,
pub max_level: u8,
pub playstyle: u8,
pub flags: PartyFlags,
pub unk: u64,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x0E)]
pub struct TransferLeaderPacket {
pub target: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x0F)]
pub struct NewLeaderPacket {
pub leader: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x10)]
pub struct KickMemberPacket {
pub member: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x11)]
pub struct KickedMemberPacket {
pub member: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x17)]
pub struct DisbandPartyPacket {
pub party: ObjectHeader,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x19)]
#[Flags(Flags::OBJECT_RELATED)]
pub struct ChatStatusPacket {
pub object: ObjectHeader,
pub status: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x1A)]
pub struct Unk0E1APacket {
pub unk1: u32,
pub unk2: u32,
pub unk3: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x1B)]
#[Flags(Flags::PACKED)]
#[Magic(0xE7E8, 0xFF)]
pub struct PartyInfoPacket {
pub num_of_infos: u32,
pub infos: [PartyInfo; 10],
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x1C)]
pub struct PartyInfoStopperPacker {
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(0x0E, 0x1D)]
#[Flags(Flags::PACKED)]
#[Magic(0xF364, 0x95)]
pub struct GetPartyDetailsPacket {
pub parties: Vec<ObjectHeader>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x1E)]
#[Flags(Flags::PACKED)]
#[Magic(0x7921, 0xE0)]
pub struct PartyDetailsPacket {
pub num_of_details: u32,
#[FixedLen(0x0C)]
pub details: Vec<PartyDetails>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x21)]
#[Flags(Flags::PACKED)]
#[Magic(0x0A5A, 0xC1)]
pub struct Unk0E21Packet {
pub people_amount: u32,
pub entries: [PartyEntry; 4],
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x25)]
pub struct SetQuestInfoPacket {
pub name: u32,
pub unk1: u32,
pub unk2: u32,
pub unk3: u16,
pub unk4: u16,
pub player: ObjectHeader,
pub unk5: [u32; 5],
pub unk6: u8,
pub unk7: u8,
pub unk8: u8,
pub diff: u8,
pub quest_type: QuestType,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x2B)]
pub struct NewBusyStatePacket {
pub object: ObjectHeader,
pub state: BusyState,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x2C)]
pub struct InviteDeclinePacket {
pub decline_status: RejectStatus,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x2E)]
#[Flags(Flags::PACKED)]
#[Magic(0xD4FC, 0x92)]
pub struct GetPartyInfoPacket {
pub parties: Vec<ObjectHeader>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x31)]
pub struct SetPartyQuestPacket {
pub name: u32,
pub difficulty: u32,
#[SeekAfter(3)]
pub quest_type: QuestType,
pub quest_def: Quest,
pub quest_diffs: QuestDifficulty,
pub player: ObjectHeader,
pub unk1: u16,
pub unk2: u16,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x4F)]
pub struct SetPartyColorPacket {
pub target: ObjectHeader,
pub unk: [u32; 3],
pub in_party: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x52)]
pub struct Unk0E52Packet {
pub unk1: u32,
pub unk2: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
#[Id(0x0E, 0x67)]
pub struct PartySetupFinishPacket {
pub unk: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, HelperReadWrite)]
pub struct PartyEntry {
pub id: ObjectHeader,
pub nickname: String,
pub char_name: String,
pub level: u8,
pub sublevel: u8,
pub class: Class,
pub subclass: Class,
pub color: Color,
pub unk1: [u8; 7],
pub unk2: u32,
pub hp: [u32; 3],
pub map_id: u16,
pub unk3: u16,
pub unk4: [u8; 0xC],
pub unk5: [u32; 3],
pub unk6: String,
#[OnlyOn(PacketType::Vita)]
pub unk10: String,
pub unk7: AsciiString,
pub lang: ShortLanguage,
pub unk9: [u8; 3],
#[cfg(feature = "ngs_packets")]
#[cfg_attr(docsrs, doc(cfg(feature = "ngs_packets")))]
#[OnlyOn(PacketType::NGS)]
pub unk11: String,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, Default, PartialEq, HelperReadWrite)]
#[repr(u8)]
pub enum Color {
#[default]
#[Read_default]
Red,
Green,
Yellow,
Blue,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, Default, PartialEq, HelperReadWrite)]
#[repr(u8)]
pub enum ShortLanguage {
#[default]
Japanese,
English,
#[Read_default]
Unknown,
}
bitflags::bitflags! {
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
#[BitFlags(u8)]
pub struct PartyFlags: u8 {
const FRIENDS_ONLY = 1 << 0;
const ALLIANCE_ONLY = 1 << 1;
const LIMIT_OTHERS = 1 << 2;
const SINGLE_RUN = 1 << 3;
const OPEN = 1 << 4;
const VC_FOCUS = 1 << 6;
const _ = !0;
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, HelperReadWrite)]
pub struct PartyInfo {
pub unk1: [u8; 0xC],
pub party_object: ObjectHeader,
pub name: String,
pub unk2: [u8; 9],
pub unk3: [u8; 3],
pub unk4: u32,
pub invite_time: u32,
pub unk6: u32,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, Default, PartialEq, HelperReadWrite)]
#[repr(u32)]
pub enum RejectStatus {
#[default]
#[Read_default]
Allow,
Reject,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, HelperReadWrite)]
pub struct PartyDetails {
pub party_desc: String,
pub party_id: ObjectHeader,
pub unk3: [u8; 0x10],
pub unk4: u64,
pub unk5: u32,
pub unk6: u32,
pub unk7: u16,
pub unk8: u16,
pub unk9: [u8; 12],
pub unk10: [PartyMember; 4],
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(default))]
#[derive(Debug, Clone, Default, PartialEq, HelperReadWrite)]
pub struct PartyMember {
pub char_name: String,
pub nickname: String,
pub id: ObjectHeader,
pub class: Class,
pub subclass: Class,
pub level: u8,
pub sublevel: u8,
pub unk4: [u8; 5],
pub unk5: [u8; 3],
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, Default, PartialEq, HelperReadWrite)]
#[repr(u32)]
pub enum BusyState {
#[default]
#[Read_default]
NotBusy,
Busy,
}