pso2packetlib/protocol/
playershop.rs

1//! Player shop related packets. \[0x2D\]
2use crate::fixed_types::{FixedBytes, FixedVec};
3
4use super::{items::Item, HelperReadWrite, ObjectHeader, PacketReadWrite};
5
6// ----------------------------------------------------------------
7// Player shop packets
8// ----------------------------------------------------------------
9
10/// (0x2D, 0x02) Player Shop Item Search Request.
11///
12/// (C -> S) Sent when the client wants to get item listings for selected item.
13///
14/// Respond with: [`crate::protocol::Packet::ProductSearchResponse`]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16#[cfg_attr(feature = "serde", serde(default))]
17#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
18#[Id(0x2D, 0x02)]
19#[Flags(Flags::PACKED)]
20#[Magic(0xD003, 0x3B)]
21pub struct ProductSearchRequestPacket {
22    pub unk1: u16,
23    pub unk2: u8,
24    pub unk3: u8,
25    /// Item's ID name.
26    pub item_name: String,
27    pub unk5: u64,
28    pub unk6: u64,
29    pub unk7: FixedBytes<12>,
30    pub unk8: FixedBytes<0x10>,
31}
32
33/// (0x2D, 0x03) Player Shop Item Search Response.
34///
35/// (S -> C) Contains currently available listings of an item.
36///
37/// Response to: [`crate::protocol::Packet::ProductSearchRequest`]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39#[cfg_attr(feature = "serde", serde(default))]
40#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
41#[Id(0x2D, 0x03)]
42#[Flags(Flags::PACKED)]
43#[Magic(0x55C1, 0x86)]
44pub struct ProductSearchResponsePacket {
45    /// All listings of the queried item.
46    pub items: Vec<SoldItem>,
47}
48
49/// (0x2D, 0x0B) Player Shop Details Request.
50///
51/// (C -> S) Sent when the client wants the details of a player's shop.
52///
53/// Respond with: [`crate::protocol::Packet::PlayerShopDetailsResponse`]
54#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
55#[cfg_attr(feature = "serde", serde(default))]
56#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
57#[Id(0x2D, 0x0B)]
58pub struct PlayerShopDetailsRequestPacket {
59    /// Queried shop's owner.
60    pub owner: ObjectHeader,
61}
62
63/// (0x2D, 0x0C) Player Shop Details Response.
64///
65/// (S -> C) Sent in response to the details request.
66///
67/// Response to: [`crate::protocol::Packet::PlayerShopDetailsRequest`]
68#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
69#[cfg_attr(feature = "serde", serde(default))]
70#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
71#[Id(0x2D, 0x0C)]
72#[Flags(Flags::PACKED)]
73#[Magic(0x096C, 0x2A)]
74pub struct PlayerShopDetailsResponsePacket {
75    /// Queried shop's owner.
76    pub owner: ObjectHeader,
77    /// Player's character name. (?)
78    pub char_name: String,
79    /// Player's username. (?)
80    pub username: String,
81    /// Shop's advertisement.
82    pub ad: String,
83    /// Symbol Art's UUID (if any).
84    pub symbol_art_uuid: u128,
85}
86
87/// (0x2D, 0x0D) Character Search Request.
88///
89/// (C -> S) Sent when the client searches for a character.
90///
91/// Respond with: [`crate::protocol::Packet::CharacterSearchResponse`]
92#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
93#[cfg_attr(feature = "serde", serde(default))]
94#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
95#[Id(0x2D, 0x0D)]
96#[Flags(Flags::PACKED)]
97#[Magic(0x8F2A, 0x75)]
98pub struct CharacterSearchRequestPacket {
99    /// Searched character name.
100    pub char_name: String,
101}
102
103/// (0x2D, 0x0E) Character Search Response.
104///
105/// (S -> C) Sent in response to a search request.
106///
107/// Response to: [`crate::protocol::Packet::CharacterSearchRequest`]
108#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
109#[cfg_attr(feature = "serde", serde(default))]
110#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
111#[Id(0x2D, 0x0E)]
112#[Flags(Flags::PACKED)]
113#[Magic(0x14E7, 0xC0)]
114pub struct CharacterSearchResponsePacket {
115    pub unk1: u8,
116    pub unk2: u8,
117    pub unk3: u16,
118    pub characters: FixedVec<0x32, CharacterSearchEntry>,
119}
120
121/// (0x2D, 0x12) Recruiting Alliances List Request.
122///
123/// (C -> S) Sent when the client wants the list of recruiting alliances.
124///
125/// Respond with: [`crate::protocol::Packet::RecruitingAlliancesResponse`]
126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
127#[cfg_attr(feature = "serde", serde(default))]
128#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
129#[Id(0x2D, 0x12)]
130pub struct RecruitingAlliancesRequestPacket {
131    pub unk: u64,
132}
133
134/// (0x2D, 0x13) Recruiting Alliances List Response.
135///
136/// (S -> C) Sent in response to a list request.
137///
138/// Response to: [`crate::protocol::Packet::RecruitingAlliancesRequest`]
139#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
140#[cfg_attr(feature = "serde", serde(default))]
141#[derive(Debug, Clone, Default, PartialEq, PacketReadWrite)]
142#[Id(0x2D, 0x13)]
143#[Flags(Flags::PACKED)]
144#[Magic(0xB19C, 0x38)]
145pub struct RecruitingAlliancesResponsePacket {
146    pub unk1: u32,
147    pub unk2: u16,
148    pub unk3: u16,
149    pub alliances: FixedVec<0x64, RecruitingAlliance>,
150}
151
152// ----------------------------------------------------------------
153// Additional structs
154// ----------------------------------------------------------------
155
156/// Item listed in a player shop.
157#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
158#[cfg_attr(feature = "serde", serde(default))]
159#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
160pub struct SoldItem {
161    /// Player that is selling the item.
162    pub seller: ObjectHeader,
163    /// Item's UUID.
164    pub uuid: u64,
165    /// Item data.
166    pub item: Item,
167    /// Amount of items sold.
168    pub amount: u32,
169    /// Price of an item.
170    pub price: u64,
171}
172
173/// Character entry in a character search results.
174#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
175#[cfg_attr(feature = "serde", serde(default))]
176#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
177pub struct CharacterSearchEntry {
178    /// Player object.
179    pub player: ObjectHeader,
180    /// Player's username.
181    pub username: String,
182    /// Character's name.
183    pub char_name: String,
184}
185
186/// Recruiting alliance entry.
187#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
188#[cfg_attr(feature = "serde", serde(default))]
189#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
190pub struct RecruitingAlliance {
191    pub unk1: u32,
192    /// Name of the alliance.
193    pub alliance_name: String,
194    /// Number of members.
195    pub members: u8,
196    /// Alliance level.
197    pub level: u8,
198    pub unk5: u8,
199    pub unk6: u8,
200    /// Alliance flag UUID.
201    pub symbol_art_uuid: u128,
202    /// Alliance leader comments.
203    pub comment: String,
204    pub unk8: u32,
205}