g_rust/extension/parsers/
incoming.rs

1use std::collections::HashMap;
2use crate::extension::parsers::stuffdata::StuffData;
3use crate::protocol::hdirection::HDirection;
4use crate::protocol::hpacket::HPacket;
5use crate::protocol::vars::legacy::{LegacyDouble, LegacyId, LegacyLength, LegacyStringId};
6use crate::protocol::vars::packetvariable::PacketVariable;
7use super::baseparser::BaseParser;
8use super::subparsers::*;
9
10// WIN63-202307020022-676506471
11
12#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
13#[to(direction = 0)]
14pub struct AuthenticationOK {
15    pub account_id: LegacyId,
16    pub suggested_login_actions: Vec<i16>,
17    pub identity_id: LegacyId
18}
19
20#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
21#[to(direction = 0)]
22pub struct CompleteDiffieHandshake {
23    pub encrypted_public_key: String,
24    pub server_client_encryption: Option<bool>
25}
26
27#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
28#[to(direction = 0)]
29pub struct DisconnectReason {
30    pub reason: Option<i32>
31}
32
33#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
34#[to(direction = 0)]
35pub struct GenericError {
36    pub error_code: i32
37}
38
39#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
40#[to(direction = 0)]
41pub struct IdentityAccounts {
42    pub accounts: HashMap<i32, String>
43}
44
45#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
46#[to(direction = 0)]
47pub struct InitDiffieHandshake {
48    pub encrypted_prime: String,
49    pub encrypted_generator: String
50}
51
52#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
53#[to(direction = 0)]
54pub struct IsFirstLoginOfDay {
55    pub is_first_login_of_day: bool
56}
57
58#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
59#[to(direction = 0)]
60pub struct NoobnessLevel {
61    pub level: i32
62}
63
64#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
65#[to(direction = 0)]
66pub struct Ping {}
67
68#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
69#[to(direction = 0)]
70pub struct UniqueMachineID {
71    pub machine_id: String
72}
73
74#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
75#[to(direction = 0)]
76pub struct UserObject {
77    pub id: LegacyId,
78    pub name: String,
79    pub figure: String,
80    pub sex: String,
81    pub custom_data: String,
82    pub real_name: String,
83    pub direct_mail: bool,
84    pub respect_total: i32,
85    pub respect_left: i32,
86    pub pet_respect_left: i32,
87    pub stream_publishing_allowed: bool,
88    pub last_access_date: String,
89    pub name_change_allowed: bool,
90    pub account_safety_locked: bool
91}
92
93#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
94#[to(direction = 0)]
95pub struct UserRights {
96    pub club_level: i32,
97    pub security_level: i32,
98    pub is_ambassador: bool
99}
100
101#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
102#[to(direction = 0)]
103pub struct CraftableProducts {
104    pub recipe_product_items: Vec<FurnitureProductItem>,
105    pub usable_inventory_furni_classes: Vec<String>
106}
107
108#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
109#[to(direction = 0)]
110pub struct CraftingRecipe {
111    pub ingredients: Vec<OutgoingIngredient>
112}
113
114#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
115#[to(direction = 0)]
116pub struct CraftingRecipesAvailable {
117    pub count: i32,
118    pub recipe_complete: bool
119}
120
121#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
122#[to(direction = 0)]
123pub struct CraftingResult {
124    pub success: bool,
125    pub product_data: FurnitureProductItem
126}
127
128impl PacketVariable for CraftingResult {
129    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
130        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
131        let success: bool = packet.read();
132        (CraftingResult {
133            success,
134            product_data: if success { packet.read() } else { Default::default() }
135        }, packet.read_index - 6)
136    }
137
138    fn to_packet(&self) -> Vec<u8> {
139        if self.success {
140            (self.success, self.product_data.clone()).to_packet()
141        } else {
142            self.success.to_packet()
143        }
144    }
145}
146
147#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
148#[to(direction = 0)]
149pub struct ForumData {
150    pub forum_data: ExtendedForumData
151}
152
153#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
154#[to(direction = 0)]
155pub struct ForumsList {
156    pub list_code: i32,
157    pub total_amount: i32,
158    pub start_index: i32,
159    pub forums: Vec<BaseForumData>
160}
161
162#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
163#[to(direction = 0)]
164pub struct ForumThreads {
165    pub group_id: LegacyId,
166    pub start_index: i32,
167    pub threads: Vec<ThreadData>
168}
169
170#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
171#[to(direction = 0)]
172pub struct PostMessage {
173    pub group_id: LegacyId,
174    pub thread_id: LegacyId,
175    pub message: MessageData
176}
177
178#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
179#[to(direction = 0)]
180pub struct PostThread {
181    pub group_id: LegacyId,
182    pub thread: ThreadData
183}
184
185#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
186#[to(direction = 0)]
187pub struct ThreadMessages {
188    pub group_id: LegacyId,
189    pub thread_id: LegacyId,
190    pub start_index: i32,
191    pub messages: Vec<MessageData>
192}
193
194#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
195#[to(direction = 0)]
196pub struct UnreadForumsCount {
197    pub count: i32
198}
199
200#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
201#[to(direction = 0)]
202pub struct UpdateMessage {
203    pub group_id: LegacyId,
204    pub thread_id: LegacyId,
205    pub message: MessageData
206}
207
208#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
209#[to(direction = 0)]
210pub struct UpdateThread {
211    pub group_id: LegacyId,
212    pub thread: ThreadData
213}
214
215#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
216#[to(direction = 0)]
217pub struct PromoArticles {
218    pub articles: Vec<PromoArticleData>
219}
220
221#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
222#[to(direction = 0)]
223pub struct CompetitionEntrySubmitResult {
224    pub goal_id: LegacyId,
225    pub goal_code: String,
226    pub result: i32,
227    pub required_furnis: Vec<String>,
228    pub present_furnis: Vec<String>
229}
230
231#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
232#[to(direction = 0)]
233pub struct CompetitionVotingInfo {
234    pub goal_id: LegacyId,
235    pub goal_code: String,
236    pub result_code: i32,
237    pub votes_remaining: i32
238}
239
240#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
241#[to(direction = 0)]
242pub struct CurrentTimingCode {
243    pub scheduling_str: String,
244    pub code: String
245}
246
247#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
248#[to(direction = 0)]
249pub struct IsUserPartOfCompetition {
250    pub is_part_of: bool,
251    pub target_id: LegacyId
252}
253
254#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
255#[to(direction = 0)]
256pub struct NoOwnedRoomsAlert {}
257
258#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
259#[to(direction = 0)]
260pub struct SecondsUntil {
261    pub time_str: String,
262    pub seconds_until: i32
263}
264
265#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
266#[to(direction = 0)]
267pub struct PhoneCollectionState {
268    pub phone_status_code: i32,
269    pub collection_status_code: i32,
270    pub milliseconds_to_allow_process_reset: i32
271}
272
273#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
274#[to(direction = 0)]
275pub struct TryPhoneNumberResult {
276    pub result_code: i32,
277    pub millis_to_allow_process_reset: i32
278}
279
280#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
281#[to(direction = 0)]
282pub struct TryVerificationCodeResult {
283    pub result_code: i32,
284    pub milliseconds_to_allow_process_reset: i32
285}
286
287#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
288#[to(direction = 0)]
289pub struct CallForHelpDisabledNotify {
290    pub info_url: String
291}
292
293#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
294#[to(direction = 0)]
295pub struct CallForHelpPendingCallsDeleted {}
296
297#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
298#[to(direction = 0)]
299pub struct CallForHelpPendingCalls {
300    pub calls: Vec<CallForHelpPendingCall>
301}
302
303#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
304#[to(direction = 0)]
305pub struct CallForHelpReply {
306    pub message: String
307}
308
309#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
310#[to(direction = 0)]
311pub struct CallForHelpResult {
312    pub result_type: i32,
313    pub message_text: String
314}
315
316#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
317#[to(direction = 0)]
318pub struct ChatReviewSessionDetached {}
319
320#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
321#[to(direction = 0)]
322pub struct ChatReviewSessionOfferedToGuide {
323    pub acceptance_timeout: i32
324}
325
326#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
327#[to(direction = 0)]
328pub struct ChatReviewSessionResults {
329    pub winning_vote_code: i32,
330    pub own_vote_code: i32,
331    pub final_status: Vec<i32>
332}
333
334#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
335#[to(direction = 0)]
336pub struct ChatReviewSessionStarted {
337    pub voting_timeout: i32,
338    pub chat_record: String
339}
340
341#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
342#[to(direction = 0)]
343pub struct ChatReviewSessionVotingStatus {
344    pub status: Vec<i32>
345}
346
347#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
348#[to(direction = 0)]
349pub struct GuideOnDutyStatus {
350    pub on_duty: bool,
351    pub guides_on_duty: i32,
352    pub helpers_on_duty: i32,
353    pub guardians_on_duty: i32
354}
355
356#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
357#[to(direction = 0)]
358pub struct GuideReportingStatus {
359    pub status_code: i32,
360    pub pending_ticket: Option<PendingGuideTicket>
361}
362
363impl PacketVariable for GuideReportingStatus {
364    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
365        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
366
367        let status_code = packet.read();
368
369        (Self {
370            status_code,
371            pending_ticket: if status_code == 1 { packet.read() } else { None }
372        }, packet.read_index - 6)
373    }
374
375    fn to_packet(&self) -> Vec<u8> {
376        if self.status_code == 1 && self.pending_ticket.is_some() {
377            (self.status_code, self.pending_ticket.clone()).to_packet()
378        } else if self.status_code == 1 {
379            2i32.to_packet()
380        } else {
381            self.status_code.to_packet()
382        }
383    }
384}
385
386#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
387#[to(direction = 0)]
388pub struct GuideSessionAttached {
389    pub as_guide: bool,
390    pub help_request_type: i32,
391    pub help_request_description: String,
392    pub role_specific_wait_time: i32
393}
394
395#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
396#[to(direction = 0)]
397pub struct GuideSessionDetached {}
398
399#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
400#[to(direction = 0)]
401pub struct GuideSessionEnded {
402    pub end_reason: i32
403}
404
405#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
406#[to(direction = 0)]
407pub struct GuideSessionError {
408    pub error_code: i32
409}
410
411#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
412#[to(direction = 0)]
413pub struct GuideSessionInvitedToGuideRoom {
414    pub room_id: LegacyId,
415    pub room_name: String
416}
417
418#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
419#[to(direction = 0)]
420pub struct GuideSessionMessage {
421    pub chat_message: String,
422    pub sender_id: LegacyId
423}
424
425#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
426#[to(direction = 0)]
427pub struct GuideSessionPartnerIsTyping {
428    pub is_typing: bool
429}
430
431#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
432#[to(direction = 0)]
433pub struct GuideSessionRequesterRoom {
434    pub requester_room_id: LegacyId
435}
436
437#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
438#[to(direction = 0)]
439pub struct GuideSessionStarted {
440    pub requester_user_id: LegacyId,
441    pub requester_name: String,
442    pub requester_figure: String,
443    pub guide_user_id: LegacyId,
444    pub guide_name: String,
445    pub guide_figure: String
446}
447
448#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
449#[to(direction = 0)]
450pub struct GuideTicketCreationResult {
451    pub localization_code: i32
452}
453
454#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
455#[to(direction = 0)]
456pub struct GuideTicketResolution {
457    pub localization_code: i32
458}
459
460#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
461#[to(direction = 0)]
462pub struct IssueCloseNotification {
463    pub close_reason: i32,
464    pub message_text: String
465}
466
467#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
468#[to(direction = 0)]
469pub struct QuizData {
470    pub quiz_code: String,
471    pub question_ids: Vec<i32>
472}
473
474#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
475#[to(direction = 0)]
476pub struct QuizResults {
477    pub quiz_code: String,
478    pub question_ids_for_wrong_answers: Vec<i32>
479}
480
481#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
482#[to(direction = 0)]
483pub struct CfhChatlog {
484    pub data: CfhChatlogData
485}
486
487#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
488#[to(direction = 0)]
489pub struct IssueDeleted {
490    pub issue_id: LegacyStringId
491}
492
493#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
494#[to(direction = 0)]
495pub struct IssueInfo {
496    pub issue_data: IssueMessageData
497}
498
499#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
500#[to(direction = 0)]
501pub struct IssuePickFailed {
502    pub issues: Vec<(LegacyId, LegacyId, String)>,
503    pub retry_enabled: bool,
504    pub retry_count: i32
505}
506
507#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
508#[to(direction = 0)]
509pub struct ModeratorActionResult {
510    pub user_id: LegacyId,
511    pub success: bool
512}
513
514#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
515#[to(direction = 0)]
516pub struct ModeratorCaution {
517    pub message: String,
518    pub url: String
519}
520
521#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
522#[to(direction = 0)]
523pub struct ModeratorInit {
524    pub data: ModeratorInitData
525}
526
527#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
528#[to(direction = 0)]
529pub struct Moderator {
530    pub message: String,
531    pub url: String
532}
533
534#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
535#[to(direction = 0)]
536pub struct ModeratorRoomInfo {
537    pub data: RoomModerationData
538}
539
540#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
541#[to(direction = 0)]
542pub struct ModeratorToolPreferences {
543    pub window_x: i32,
544    pub window_y: i32,
545    pub window_width: i32,
546    pub window_height: i32
547}
548
549#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
550#[to(direction = 0)]
551pub struct ModeratorUserInfo {
552    pub data: ModeratorUserInfoData
553}
554
555#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
556#[to(direction = 0)]
557pub struct RoomChatlog {
558    pub data: ChatRecordData
559}
560
561#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
562#[to(direction = 0)]
563pub struct RoomVisits {
564    pub data: RoomVisitsData
565}
566
567#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
568#[to(direction = 0)]
569pub struct UserBanned {
570    pub message: String
571}
572
573#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
574#[to(direction = 0)]
575pub struct UserChatlog {
576    pub data: UserChatlogData
577}
578
579#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
580#[to(direction = 0)]
581pub struct FurniListAddOrUpdate {
582    pub furni: FurniData
583}
584
585#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
586#[to(direction = 0)]
587pub struct FurniList {
588    pub total_fragments: i32,
589    pub fragment_no: i32,
590    pub furni_fragment: Vec<FurniData>
591}
592
593#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
594#[to(direction = 0)]
595pub struct FurniListInvalidate {}
596
597#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
598#[to(direction = 0)]
599pub struct FurniListRemove {
600    pub strip_id: LegacyId
601}
602
603#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
604#[to(direction = 0)]
605pub struct PostItPlaced {
606    pub id: LegacyId,
607    pub items_left: i32
608}
609
610// TODO
611
612#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
613#[to(direction = 0)]
614pub struct YouAreController {
615    pub flat_id: LegacyId,
616    pub room_controller_level: i32
617}
618
619#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
620#[to(direction = 0)]
621pub struct YouAreNotController {
622    pub flat_id: LegacyId
623}
624
625#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
626#[to(direction = 0)]
627pub struct YouAreOwner {
628    pub flat_id: LegacyId
629}
630
631#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
632#[to(direction = 0)]
633pub struct CancelMysteryBoxWait {}
634
635#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
636#[to(direction = 0)]
637pub struct GotMysteryBoxPrize {
638    pub content_type: String,
639    pub class_id: i32 // Might be a LegacyId
640}
641
642#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
643#[to(direction = 0)]
644pub struct MysteryBoxKeys {
645    pub box_color: String,
646    pub key_color: String
647}
648
649#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
650#[to(direction = 0)]
651pub struct ShowMysteryBoxWait {}
652
653#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
654#[to(direction = 0)]
655pub struct AccountSafetyLockStatusChange {
656    pub status: i32
657}
658
659#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
660#[to(direction = 0)]
661pub struct ApproveName {
662    pub result: i32,
663    pub name_validation_info: String
664}
665
666#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
667#[to(direction = 0)]
668pub struct ChangeEmailResult {
669    pub result: i32
670}
671
672#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
673#[to(direction = 0)]
674pub struct EmailStatusResult {
675    pub email: String,
676    pub is_verified: bool,
677    pub allow_change: bool
678}
679
680#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
681#[to(direction = 0)]
682pub struct ExtendedProfileChanged {
683    pub user_id: LegacyId
684}
685
686#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
687#[to(direction = 0)]
688pub struct ExtendedProfile {
689    pub data: ExtendedProfileData
690}
691
692#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
693#[to(direction = 0)]
694pub struct GroupDetailsChanged {
695    pub group_id: LegacyId
696}
697
698#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
699#[to(direction = 0)]
700pub struct GroupMembershipRequested {
701    pub group_id: LegacyId,
702    pub requester: MemberData
703}
704
705#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
706#[to(direction = 0)]
707pub struct GuildCreated {
708    pub base_room_id: LegacyId,
709    pub group_id: LegacyId
710}
711
712#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
713#[to(direction = 0)]
714pub struct GuildCreationInfo {
715    pub data: GuildCreationData
716}
717
718#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
719#[to(direction = 0)]
720pub struct GuildEditFailed {
721    pub reason: i32
722}
723
724#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
725#[to(direction = 0)]
726pub struct GuildEditInfo {
727    pub data: GuildEditData
728}
729
730#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
731#[to(direction = 0)]
732pub struct GuildEditorData {
733    pub base_parts: Vec<BadgePartData>,
734    pub layer_parts: Vec<BadgePartData>,
735    pub badge_colors: Vec<GuildColorData>,
736    pub primary_colors: Vec<GuildColorData>,
737    pub secondary_colors: Vec<GuildColorData>
738}
739
740#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
741#[to(direction = 0)]
742pub struct GuildMemberFurniCountInHQ {
743    pub user_id: LegacyId,
744    pub furni_count: i32
745}
746
747#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
748#[to(direction = 0)]
749pub struct GuildMemberMgmtFailed {
750    pub guild_id: LegacyId,
751    pub reason: i32
752}
753
754#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
755#[to(direction = 0)]
756pub struct GuildMembershipRejected {
757    pub guild_id: LegacyId,
758    pub user_id: LegacyId
759}
760
761#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
762#[to(direction = 0)]
763pub struct GuildMemberships {
764    pub guilds: Vec<HabboGroupEntryData>
765}
766
767#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
768#[to(direction = 0)]
769pub struct GuildMembershipUpdated {
770    pub guild_id: LegacyId,
771    pub data: MemberData
772}
773
774#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
775#[to(direction = 0)]
776pub struct GuildMembers {
777    pub data: Vec<GuildMemberData>
778}
779
780#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
781#[to(direction = 0)]
782pub struct HabboGroupBadges {
783    pub badges: HashMap<i32, String>
784}
785
786#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
787#[to(direction = 0)]
788pub struct HabboGroupDeactivated {
789    pub group_id: LegacyId
790}
791
792#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
793#[to(direction = 0)]
794pub struct HabboGroupDetails {
795    pub data: HabboGroupDetailsData
796}
797
798#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
799#[to(direction = 0)]
800pub struct HabboGroupJoinFailed {
801    pub reason: i32
802}
803
804#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
805#[to(direction = 0)]
806pub struct HabboUserBadges {
807    pub user_id: LegacyId,
808    pub badges: HashMap<i32, String>
809}
810
811#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
812#[to(direction = 0)]
813pub struct HandItemReceived {
814    pub giver_user_id: LegacyId,
815    pub hand_item_type: i32
816}
817
818#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
819#[to(direction = 0)]
820pub struct IgnoredUsers {
821    pub ignored_users: Vec<String>
822}
823
824#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
825#[to(direction = 0)]
826pub struct IgnoreResult {
827    pub result: i32,
828    pub name: String
829}
830
831#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
832#[to(direction = 0)]
833pub struct InClientLink {
834    pub link: String
835}
836
837#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
838#[to(direction = 0)]
839pub struct PetRespectNotification {
840    pub respect: i32,
841    pub pet_owner_id: LegacyId,
842    pub pet_data: PetData
843}
844
845#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
846#[to(direction = 0)]
847pub struct PetSupplementedNotification {
848    pub pet_id: LegacyId,
849    pub user_id: LegacyId,
850    pub supplement_type: i32
851}
852
853#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
854#[to(direction = 0)]
855pub struct RelationshipStatusInfo {
856    pub user_id: LegacyId,
857    pub relationship_statuses: Vec<RelationshipStatusInfoData>
858}
859
860#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
861#[to(direction = 0)]
862pub struct RespectNotification {
863    pub user_id: LegacyId,
864    pub respect_total: i32
865}
866
867#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
868#[to(direction = 0)]
869pub struct ScrSendKickbackInfo {
870    pub data: ScrKickbackData
871}
872
873#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
874#[to(direction = 0)]
875pub struct ScrSendUserInfo {
876    pub product_name: String,
877    pub days_to_period_end: i32,
878    pub member_periods: i32,
879    pub periods_subscribed_ahead: i32,
880    pub response_type: i32,
881    pub has_ever_been_member: bool,
882    pub is_vip: bool,
883    pub past_club_days: bool,
884    pub past_vip_days: bool,
885    pub minutes_until_expiration: i32,
886    pub minutes_since_last_modified: Option<i32>
887}
888
889#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
890#[to(direction = 0)]
891pub struct UserNameChanged {
892    pub web_id: i32, // Might be a LegacyId
893    pub id: LegacyId,
894    pub new_name: String
895}
896
897#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
898#[to(direction = 0)]
899pub struct RoomEntryTile {
900    pub x: i32,
901    pub y: i32,
902    pub dir: i32
903}
904
905#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
906#[to(direction = 0)]
907pub struct RoomOccupiedTiles {
908    pub occupied_tiles: Vec<(i32, i32)>
909}
910
911#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
912#[to(direction = 0)]
913pub struct CantConnect {
914    pub reason: i32,
915    pub parameter: String
916}
917
918impl PacketVariable for CantConnect {
919    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
920        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
921        let reason = packet.read();
922        let parameter = if reason == 3 { packet.read() } else { String::from("") };
923        (CantConnect { reason, parameter }, packet.read_index - 6)
924    }
925
926    fn to_packet(&self) -> Vec<u8> {
927        let mut packet = HPacket::from_header_id(0);
928        packet.append(self.reason);
929        if self.reason == 3 {
930            packet.append(self.parameter.clone());
931        }
932        packet.get_bytes()[6..].to_vec()
933    }
934}
935
936#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
937#[to(direction = 0)]
938pub struct CloseConnection {}
939
940#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
941#[to(direction = 0)]
942pub struct FlatAccessible {
943    pub flat_id: LegacyId,
944    pub user_name: String
945}
946
947#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
948#[to(direction = 0)]
949pub struct GamePlayerValue {
950    pub user_id: LegacyId,
951    pub value: i32
952}
953
954#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
955#[to(direction = 0)]
956pub struct OpenConnection {
957    pub flat_id: LegacyId
958}
959
960#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
961#[to(direction = 0)]
962pub struct RoomForward {
963    pub room_id: LegacyId
964}
965
966#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
967#[to(direction = 0)]
968pub struct RoomQueueStatus {
969    pub flat_id: LegacyId,
970    pub queue: RoomQueueSet
971}
972
973#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
974#[to(direction = 0)]
975pub struct RoomReady {
976    pub room_type: String,
977    pub room_id: LegacyId
978}
979
980#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
981#[to(direction = 0)]
982pub struct YouArePlayingGame {
983    pub is_playing: bool
984}
985
986#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
987#[to(direction = 0)]
988pub struct YouAreSpectator {
989    pub flat_id: LegacyId
990}
991
992#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
993#[to(direction = 0)]
994pub struct CampaignCalendarData {
995    pub campaign_name: String,
996    pub campaign_image: String,
997    pub current_day: i32,
998    pub campaign_days: i32,
999    pub opened_days: Vec<i32>,
1000    pub missed_days: Vec<i32>
1001}
1002
1003#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1004#[to(direction = 0)]
1005pub struct CampaignCalendarDoorOpened {
1006    pub door_opened: bool,
1007    pub product_name: String,
1008    pub custom_image: String,
1009    pub furniture_class_name: String
1010}
1011
1012#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1013#[to(direction = 0)]
1014pub struct Interstitial {
1015    pub can_show_interstitial: bool
1016}
1017
1018#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1019#[to(direction = 0)]
1020pub struct RoomAdError {
1021    pub error_code: i32,
1022    pub filtered_text: String
1023}
1024
1025#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1026#[to(direction = 0)]
1027pub struct AchievementResolutionCompleted {
1028    pub stuff_code: String,
1029    pub badge_code: String
1030}
1031
1032#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1033#[to(direction = 0)]
1034pub struct AchievementResolutionProgress {
1035    pub stuff_id: LegacyId,
1036    pub achievement_id: LegacyId,
1037    pub required_level_badge_code: String,
1038    pub user_progress: i32,
1039    pub total_progress: i32,
1040    pub end_time: i32
1041}
1042
1043#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1044#[to(direction = 0)]
1045pub struct AchievementResolutions {
1046    pub stuff_id: LegacyId,
1047    pub achievements: Vec<AchievementResolutionData>,
1048    pub end_time: i32
1049}
1050
1051#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1052#[to(direction = 0)]
1053pub struct Chat {
1054    pub user_index: i32,
1055    pub text: String,
1056    pub gesture: i32,
1057    pub style_id: i32,
1058    pub links: Vec<(String, String, bool)>,
1059    pub tracking_id: i32
1060}
1061
1062#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1063#[to(direction = 0)]
1064pub struct FloodControl {
1065    pub seconds: i32
1066}
1067
1068#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1069#[to(direction = 0)]
1070pub struct RemainingMutePeriod {
1071    pub seconds_remaining: i32
1072}
1073
1074#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1075#[to(direction = 0)]
1076pub struct RoomChatSettings {
1077    pub mode: i32,
1078    pub bubble_width: i32,
1079    pub scroll_speed: i32,
1080    pub full_hear_range: i32,
1081    pub flood_sensitivity: i32
1082}
1083
1084#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1085#[to(direction = 0)]
1086pub struct RoomFilterSettings {
1087    pub bad_words: Vec<String>
1088}
1089
1090#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1091#[to(direction = 0)]
1092pub struct Shout {
1093    pub user_index: i32,
1094    pub text: String,
1095    pub gesture: i32,
1096    pub style_id: i32,
1097    pub links: Vec<(String, String, bool)>,
1098    pub tracking_id: i32
1099}
1100
1101#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1102#[to(direction = 0)]
1103pub struct UserTyping {
1104    pub user_index: i32,
1105    pub state: i32
1106}
1107
1108#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1109#[to(direction = 0)]
1110pub struct Whisper {
1111    pub user_index: i32,
1112    pub text: String,
1113    pub gesture: i32,
1114    pub style_id: i32,
1115    pub links: Vec<(String, String, bool)>,
1116    pub tracking_id: i32
1117}
1118
1119#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1120#[to(direction = 0)]
1121pub struct CanCreateRoom {
1122    pub result_code: i32,
1123    pub room_limit: i32
1124}
1125
1126#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1127#[to(direction = 0)]
1128pub struct CategoriesWithVisitorCount {
1129    pub data: CategoriesWithVisitorCountData
1130}
1131
1132#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1133#[to(direction = 0)]
1134pub struct CompetitionRoomsData {
1135    pub goal_id: i32,
1136    pub page_index: i32,
1137    pub page_count: i32
1138}
1139
1140#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1141#[to(direction = 0)]
1142pub struct ConvertedRoomId {
1143    pub global_id: String,
1144    pub converted_id: LegacyId
1145}
1146
1147#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1148#[to(direction = 0)]
1149pub struct Doorbell {
1150    pub user_name: String
1151}
1152
1153#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1154#[to(direction = 0)]
1155pub struct FavouriteChanged {
1156    pub flat_id: LegacyId,
1157    pub added: bool
1158}
1159
1160#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1161#[to(direction = 0)]
1162pub struct Favourites {
1163    pub limit: i32,
1164    pub favourite_room_ids: Vec<LegacyId>
1165}
1166
1167#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1168#[to(direction = 0)]
1169pub struct FlatAccessDenied {
1170    pub flat_id: LegacyId,
1171    pub user_name: Option<String>
1172}
1173
1174#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1175#[to(direction = 0)]
1176pub struct FlatCreated {
1177    pub flat_id: LegacyId,
1178    pub flat_name: String
1179}
1180
1181#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1182#[to(direction = 0)]
1183pub struct GetGuestRoomResult {
1184    pub enter_room: bool,
1185    pub data: GuestRoomData,
1186    pub room_forward: bool,
1187    pub staff_pick: bool,
1188    pub is_group_member: bool,
1189    pub all_in_room_muted: bool,
1190    pub room_moderation_settings: RoomModerationSettings,
1191    pub can_mute: bool,
1192    pub chat_settings: RoomChatSettings
1193}
1194
1195#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1196#[to(direction = 0)]
1197pub struct GuestRoomSearchResult {
1198    pub data: GuestRoomSearchResultData
1199}
1200
1201#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1202#[to(direction = 0)]
1203pub struct NavigatorSettings {
1204    pub home_room_id: LegacyId,
1205    pub room_id_to_enter: LegacyId
1206}
1207
1208#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1209#[to(direction = 0)]
1210pub struct OfficialRooms {
1211    pub data: OfficialRoomsData,
1212    pub ad_room: Option<OfficialRoomEntryData>,
1213    pub promoted_rooms: PromotedRoomsData
1214}
1215
1216impl PacketVariable for OfficialRooms {
1217    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1218        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1219
1220        let data = packet.read();
1221        let ad_room = if packet.read::<i32>() > 0 { packet.read() } else { None };
1222        let promoted_rooms = packet.read();
1223
1224        (OfficialRooms { data, ad_room, promoted_rooms }, packet.read_index - 6)
1225    }
1226
1227    fn to_packet(&self) -> Vec<u8> {
1228        let mut packet = HPacket::from_header_id(0);
1229
1230        packet.append((
1231            self.data.clone(),
1232            if self.ad_room.is_some() { 1 } else { 0 },
1233            self.ad_room.clone(),
1234            self.promoted_rooms.clone()
1235        ));
1236
1237        packet.get_bytes()[6..].to_vec()
1238    }
1239}
1240
1241#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1242#[to(direction = 0)]
1243pub struct PopularRoomTagsResult {
1244    pub data: PopularRoomTagsData
1245}
1246
1247#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1248#[to(direction = 0)]
1249pub struct RoomEventCancel {}
1250
1251#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1252#[to(direction = 0)]
1253pub struct RoomEvent {
1254    pub data: RoomEventData
1255}
1256
1257#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1258#[to(direction = 0)]
1259pub struct RoomInfoUpdated {
1260    pub flat_id: LegacyId
1261}
1262
1263#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1264#[to(direction = 0)]
1265pub struct RoomRating {
1266    pub rating: i32,
1267    pub can_rate: bool
1268}
1269
1270#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1271#[to(direction = 0)]
1272pub struct UserEventCats {
1273    pub event_categories: Vec<EventCategory>
1274}
1275
1276#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1277#[to(direction = 0)]
1278pub struct UserFlatCats {
1279    pub nodes: Vec<FlatCategory>
1280}
1281
1282#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1283#[to(direction = 0)]
1284pub struct CustomStackingHeightUpdate {
1285    pub furni_id: LegacyId,
1286    pub height: i32
1287}
1288
1289#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1290#[to(direction = 0)]
1291pub struct CustomUserNotification {
1292    pub code: i32
1293}
1294
1295#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1296#[to(direction = 0)]
1297pub struct DiceValue {
1298    pub id: LegacyId,
1299    pub value: i32
1300}
1301
1302#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1303#[to(direction = 0)]
1304pub struct FurniRentOrBuyoutOffer {
1305    pub is_wall_item: bool,
1306    pub furni_type_name: String,
1307    pub buyout: bool,
1308    pub price_in_credits: i32,
1309    pub price_in_activity_points: i32,
1310    pub activity_point_type: i32
1311}
1312
1313#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1314#[to(direction = 0)]
1315pub struct GuildFurniContextMenuInfo {
1316    pub object_id: LegacyId,
1317    pub guild_id: LegacyId,
1318    pub guild_name: String,
1319    pub guild_home_room_id: LegacyId,
1320    pub user_is_member: bool,
1321    pub guild_has_readable_forum: bool
1322}
1323
1324#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1325#[to(direction = 0)]
1326pub struct OneWayDoorStatus {
1327    pub id: LegacyId,
1328    pub status: i32
1329}
1330
1331#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1332#[to(direction = 0)]
1333pub struct OpenPetPackageRequested {
1334    pub object_id: LegacyId,
1335    pub figure_data: Option<PetFigureData>
1336}
1337
1338#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1339#[to(direction = 0)]
1340pub struct OpenPetPackageResult {
1341    pub object_id: LegacyId,
1342    pub name_validation_status: i32,
1343    pub name_validation_info: String
1344}
1345
1346#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1347#[to(direction = 0)]
1348pub struct PresentOpened {
1349    pub item_type: String,
1350    pub class_id: LegacyId,
1351    pub product_code: String,
1352    pub placed_item_id: LegacyId,
1353    pub placed_item_type: String,
1354    pub placed_in_room: bool,
1355    pub pet_figure_string: String
1356}
1357
1358#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1359#[to(direction = 0)]
1360pub struct RentableSpaceRentFailed {
1361    pub reason: i32
1362}
1363
1364#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1365#[to(direction = 0)]
1366pub struct RentableSpaceRentOk {
1367    pub expiry_time: i32
1368}
1369
1370#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1371#[to(direction = 0)]
1372pub struct RentableSpaceStatus {
1373    pub rented: bool,
1374    pub can_rent_error_code: i32,
1375    pub renter_id: LegacyId,
1376    pub renter_name: String,
1377    pub time_remaining: i32,
1378    pub price: i32
1379}
1380
1381#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1382#[to(direction = 0)]
1383pub struct RequestSpamWallPostIt {
1384    pub item_id: LegacyId,
1385    pub location: String
1386}
1387
1388#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1389#[to(direction = 0)]
1390pub struct RoomDimmerPresets {
1391    pub presets: Vec<RoomDimmerPresetsMessageData>
1392}
1393
1394#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1395#[to(direction = 0)]
1396pub struct RoomMessageNotification {
1397    pub room_id: LegacyId,
1398    pub room_name: String,
1399    pub message_count: i32
1400}
1401
1402#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1403#[to(direction = 0)]
1404pub struct YoutubeControlVideo {
1405    pub furni_id: LegacyId,
1406    pub command_id: LegacyId
1407}
1408
1409#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1410#[to(direction = 0)]
1411pub struct YoutubeDisplayPlaylists {
1412    pub furni_id: LegacyId,
1413    pub playlist: Vec<YoutubeDisplayPlaylist>,
1414    pub selected_playlist_id: String
1415}
1416
1417#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1418#[to(direction = 0)]
1419pub struct YoutubeDisplayVideo {
1420    pub furni_id: LegacyId,
1421    pub video_id: String,
1422    pub start_at_seconds: i32,
1423    pub end_at_seconds: i32,
1424    pub state: i32
1425}
1426
1427#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1428#[to(direction = 0)]
1429pub struct PollContents {
1430    pub id: LegacyId,
1431    pub start_message: String,
1432    pub end_message: String,
1433    pub questions: Vec<PollQuestion>,
1434    pub nps_poll: bool
1435}
1436
1437impl PacketVariable for PollContents {
1438    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1439        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1440
1441        let (id, start_message, end_message) = packet.read();
1442        let mut questions = Vec::new();
1443        let question_count: LegacyLength = packet.read();
1444        for _ in 0..*question_count {
1445            let mut question: PollQuestion = packet.read();
1446            question.children = packet.read();
1447            questions.push(question);
1448        }
1449        let nps_poll = packet.read();
1450
1451        (PollContents {
1452            id, start_message, end_message, questions, nps_poll
1453        }, packet.read_index - 6)
1454    }
1455
1456    fn to_packet(&self) -> Vec<u8> {
1457        let mut packet = HPacket::from_header_id(0);
1458
1459        packet.append((self.id, self.start_message.clone(), self.end_message.clone()));
1460        packet.append(LegacyLength(self.questions.len() as i32));
1461        for question in self.questions.iter() {
1462            packet.append(question.clone());
1463            packet.append(question.children.clone());
1464        }
1465        packet.append(self.nps_poll);
1466
1467        packet.get_bytes()[6..].to_vec()
1468    }
1469}
1470
1471#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1472#[to(direction = 0)]
1473pub struct PollError {}
1474
1475#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1476#[to(direction = 0)]
1477pub struct PollOffer {
1478    pub id: LegacyId,
1479    pub offer_type: String,
1480    pub headline: String,
1481    pub summary: String
1482}
1483
1484#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1485#[to(direction = 0)]
1486pub struct QuestionAnswered {
1487    pub user_id: LegacyId,
1488    pub value: String,
1489    pub answer_counts: HashMap<String, i32>
1490}
1491
1492#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1493#[to(direction = 0)]
1494pub struct Question {
1495    pub poll_type: String,
1496    pub poll_id: LegacyId,
1497    pub question_id: LegacyId,
1498    pub duration: i32,
1499    pub question: QuestionData
1500}
1501
1502#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1503#[to(direction = 0)]
1504pub struct QuestionFinished {
1505    pub question_id: LegacyId,
1506    pub answer_counts: HashMap<String, i32>
1507}
1508
1509#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1510#[to(direction = 0)]
1511pub struct ErrorReport {
1512    pub message_id: LegacyId,
1513    pub error_code: i32,
1514    pub timestamp: String
1515}
1516
1517#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1518#[to(direction = 0)]
1519pub struct BonusRareInfo {
1520    pub product_type: String,
1521    pub product_class_id: i32, // Might be a LegacyId,
1522    pub total_coins_for_bonus: i32,
1523    pub coins_still_required_to_buy: i32
1524}
1525
1526#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1527#[to(direction = 0)]
1528pub struct BuildersClubFurniCount {
1529    pub furni_count: i32
1530}
1531
1532#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1533#[to(direction = 0)]
1534pub struct BuildersClubSubscriptionStatus {
1535    pub seconds_left: i32,
1536    pub furni_limit: i32,
1537    pub max_furni_limit: i32,
1538    pub seconds_left_with_grace: Option<i32>
1539}
1540
1541#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1542#[to(direction = 0)]
1543pub struct BundleDiscountRuleset {
1544    pub max_purchase_size: i32,
1545    pub bundle_size: i32,
1546    pub bundle_discount_size: i32,
1547    pub bonus_threshold: i32,
1548    pub additional_bonus_discount_threshold_quantities: Vec<i32>
1549}
1550
1551#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1552#[to(direction = 0)]
1553pub struct CatalogIndex {
1554    pub root: CatalogNodeData,
1555    pub new_additions_available: bool,
1556    pub catalog_type: String
1557}
1558
1559#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1560#[to(direction = 0)]
1561pub struct CatalogPage {
1562    pub page_id: LegacyId,
1563    pub catalog_type: String,
1564    pub layout_code: String,
1565    pub localization: CatalogLocalizationData,
1566    pub offers: Vec<CatalogPageMessageOfferData>,
1567    pub offer_id: LegacyId,
1568    pub accept_season_currency_as_credits: bool,
1569    pub front_page_items: Option<Vec<FrontPageItem>>
1570}
1571
1572#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1573#[to(direction = 0)]
1574pub struct CatalogPageWithEarliestExpiry {
1575    pub page_name: String,
1576    pub seconds_to_expiry: i32,
1577    pub image: String
1578}
1579
1580#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1581#[to(direction = 0)]
1582pub struct CatalogPublished {
1583    pub instantly_refresh_catalogue: bool,
1584    pub new_furni_data_hash: Option<String>
1585}
1586
1587#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1588#[to(direction = 0)]
1589pub struct ClubGiftInfo {
1590    pub days_until_next_gift: i32,
1591    pub gifts_available: i32,
1592    pub offers: Vec<CatalogPageMessageOfferData>,
1593    pub gift_data: Vec<ClubGiftData>
1594}
1595
1596#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1597#[to(direction = 0)]
1598pub struct ClubGiftSelected {
1599    pub product_code: String,
1600    pub products: Vec<CatalogPageMessageProductData>
1601}
1602
1603#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1604#[to(direction = 0)]
1605pub struct GiftReceiverNotFound {}
1606
1607#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1608#[to(direction = 0)]
1609pub struct GiftWrappingConfiguration {
1610    pub is_wrapping_enabled: bool,
1611    pub wrapping_price: i32,
1612    pub stuff_types: Vec<i32>,
1613    pub box_types: Vec<i32>,
1614    pub ribbon_types: Vec<i32>,
1615    pub default_stuff_types: Vec<i32>
1616}
1617
1618#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1619#[to(direction = 0)]
1620pub struct HabboClubExtendOffer {
1621    pub offer: ClubOfferExtendData
1622}
1623
1624#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1625#[to(direction = 0)]
1626pub struct LimitedEditionSoldOut {}
1627
1628#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1629#[to(direction = 0)]
1630pub struct LimitedOfferAppearingNext {
1631    pub appears_in_seconds: i32,
1632    pub page_id: LegacyId,
1633    pub offer_id: LegacyId,
1634    pub product_type: String
1635}
1636
1637#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1638#[to(direction = 0)]
1639pub struct NotEnoughBalance {
1640    pub not_enough_credits: bool,
1641    pub not_enough_activity_points: bool,
1642    pub activity_point_type: Option<i32>
1643}
1644
1645#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1646#[to(direction = 0)]
1647pub struct ProductOffer {
1648    pub offer_data: CatalogPageMessageOfferData
1649}
1650
1651#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1652#[to(direction = 0)]
1653pub struct PurchaseError {
1654    pub error_code: i32
1655}
1656
1657#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1658#[to(direction = 0)]
1659pub struct PurchaseNotAllowed {
1660    pub error_code: i32
1661}
1662
1663#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1664#[to(direction = 0)]
1665pub struct PurchaseOK {
1666    pub offer: PurchaseOKMessageOfferData
1667}
1668
1669#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1670#[to(direction = 0)]
1671pub struct RoomAdPurchaseInfo {
1672    pub is_vip: bool,
1673    pub rooms: Vec<RoomEntryData>
1674}
1675
1676#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1677#[to(direction = 0)]
1678pub struct SeasonalCalendarDailyOffer {
1679    pub page_id: LegacyId,
1680    pub offer_data: Vec<CatalogPageMessageOfferData>
1681}
1682
1683#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1684#[to(direction = 0)]
1685pub struct SellablePetPalettes {
1686    pub product_code: String,
1687    pub sellable_palettes: Vec<SellablePetPaletteData>
1688}
1689
1690#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1691#[to(direction = 0)]
1692pub struct SnowWarGameTokens {
1693    pub offers: Vec<SnowWarGameTokenOffer>
1694}
1695
1696#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1697#[to(direction = 0)]
1698pub struct TargetedOffer {
1699    pub tracking_state: i32,
1700    pub id: LegacyId,
1701    pub identifier: String,
1702    pub product_code: String,
1703    pub price_in_credits: i32,
1704    pub price_in_activity_points: i32,
1705    pub activity_point_type: i32,
1706    pub purchase_limit: i32,
1707    pub expiration_time: i32,
1708    pub title: String,
1709    pub description: String,
1710    pub image_url: String,
1711    pub icon_image_url: String,
1712    pub offer_type: i32,
1713    pub sub_product_codes: Vec<String>
1714}
1715
1716#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1717#[to(direction = 0)]
1718pub struct TargetedOfferNotFound {}
1719
1720#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1721#[to(direction = 0)]
1722pub struct VoucherRedeemError {
1723    pub error_code: String
1724}
1725
1726#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1727#[to(direction = 0)]
1728pub struct VoucherRedeemOk {
1729    pub product_description: String,
1730    pub product_name: String
1731}
1732
1733#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1734#[to(direction = 0)]
1735pub struct FavoriteMembershipUpdate {
1736    pub room_index: i32,
1737    pub habbo_group_id: LegacyId,
1738    pub status: i32,
1739    pub habbo_group_name: String
1740}
1741
1742#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1743#[to(direction = 0)]
1744pub struct FloorHeightMap {
1745    pub is_small_scale: bool,
1746    pub fixed_walls_height: i32,
1747    pub text: String
1748}
1749
1750#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1751#[to(direction = 0)]
1752pub struct FurnitureAliases {
1753    pub aliases: HashMap<String, String>
1754}
1755
1756#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1757#[to(direction = 0)]
1758pub struct HeightMap {
1759    pub width: i32,
1760    pub height: i32,
1761    pub tiles: Vec<HeightMapTile>
1762}
1763
1764impl HeightMap {
1765    pub fn get_tile(self, x: usize, y: usize) -> Option<HeightMapTile> {
1766        if x >= self.width as usize || y >= self.height as usize || y * self.width as usize + x >= self.tiles.len() {
1767            None
1768        } else {
1769            Some(self.tiles[y * self.width as usize + x].clone())
1770        }
1771    }
1772
1773    pub fn set_tile(&mut self, x: usize, y: usize, tile: HeightMapTile) {
1774        if !(x >= self.width as usize || y >= self.height as usize || y * self.width as usize + x >= self.tiles.len()) {
1775            self.tiles[y * self.width as usize + x] = tile.clone()
1776        }
1777    }
1778}
1779
1780impl PacketVariable for HeightMap {
1781    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1782        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1783
1784        let (width, size): (i32, LegacyLength) = packet.read();
1785        let height = *size as i32/width;
1786        let mut tiles = Vec::new();
1787        for _ in 0..*size {
1788            tiles.push(packet.read());
1789        }
1790
1791        (Self {
1792            width, height, tiles
1793        }, packet.read_index - 6)
1794    }
1795
1796    fn to_packet(&self) -> Vec<u8> {
1797        let mut packet = HPacket::from_header_id(0);
1798
1799        packet.append((
1800            self.width, self.width * self.height
1801        ));
1802        if self.width * self.height != self.tiles.len() as i32 {
1803            panic!("HeightMap: There should be width * height tiles");
1804        }
1805        for tile in self.tiles.clone() {
1806            packet.append(tile.clone());
1807        }
1808
1809        packet.get_bytes()[6..].to_vec()
1810    }
1811}
1812
1813#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1814#[to(direction = 0)]
1815pub struct HeightMapUpdate {
1816    pub tile_updates: Vec<HeightMapTileUpdate>
1817}
1818
1819impl PacketVariable for HeightMapUpdate {
1820    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1821        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1822
1823        let mut tile_updates = Vec::new();
1824        let count: i8 = packet.read();
1825        for _ in 0..count {
1826            tile_updates.push(packet.read());
1827        }
1828
1829        (Self {
1830            tile_updates
1831        }, packet.read_index - 6)
1832    }
1833
1834    fn to_packet(&self) -> Vec<u8> {
1835        let mut packet = HPacket::from_header_id(0);
1836
1837        packet.append(self.tile_updates.len() as i16);
1838        for update in self.tile_updates.clone() {
1839            packet.append(update.clone());
1840        }
1841
1842        packet.get_bytes()[6..].to_vec()
1843    }
1844}
1845
1846#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1847#[to(direction = 0)]
1848pub struct ItemAdd {
1849    pub item: WallItem
1850}
1851
1852impl PacketVariable for ItemAdd {
1853    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1854        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1855
1856        let mut item: WallItem = packet.read();
1857        item.owner_name = packet.read();
1858
1859        (Self {
1860            item
1861        }, packet.read_index - 6)
1862    }
1863
1864    fn to_packet(&self) -> Vec<u8> {
1865        self.item.to_packet()
1866    }
1867}
1868
1869#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1870#[to(direction = 0)]
1871pub struct ItemDataUpdate {
1872    pub id: LegacyStringId,
1873    pub item_data: String
1874}
1875
1876#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1877#[to(direction = 0)]
1878pub struct ItemRemove {
1879    pub item_id: LegacyStringId,
1880    pub picker_id: LegacyId
1881}
1882
1883#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1884#[to(direction = 0)]
1885pub struct Items {
1886    pub owner_names: HashMap<LegacyId, String>,
1887    pub items: Vec<WallItem>
1888}
1889
1890#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1891#[to(direction = 0)]
1892pub struct ItemUpdate {
1893    pub data: WallItem
1894}
1895
1896#[derive(BaseParser, Clone, Debug, PartialEq)]
1897#[to(direction = 0)]
1898pub struct ObjectAdd {
1899    pub object: FloorItem
1900}
1901
1902impl PacketVariable for ObjectAdd {
1903    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1904        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1905
1906        let mut object: FloorItem = packet.read();
1907        object.owner_name = packet.read();
1908
1909        (Self {
1910            object
1911        }, packet.read_index - 6)
1912    }
1913
1914    fn to_packet(&self) -> Vec<u8> {
1915        self.object.to_packet()
1916    }
1917}
1918
1919#[derive(BaseParser, Clone, Debug, PacketVariable, PartialEq)]
1920#[to(direction = 0)]
1921pub struct ObjectDataUpdate {
1922    pub id: LegacyStringId,
1923    pub data: StuffData
1924}
1925
1926#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1927#[to(direction = 0)]
1928pub struct ObjectRemove {
1929    pub id: LegacyStringId,
1930    pub is_expired: bool,
1931    pub picker_id: LegacyId,
1932    pub delay: i32
1933}
1934
1935#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1936#[to(direction = 0)]
1937pub struct ObjectsDataUpdate {
1938    pub data_updates: HashMap<LegacyId, StuffData>
1939}
1940
1941#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1942#[to(direction = 0)]
1943pub struct Objects {
1944    pub owner_names: HashMap<LegacyId, String>,
1945    pub objects: Vec<FloorItem>
1946}
1947
1948#[derive(BaseParser, Clone, Debug, PacketVariable, PartialEq)]
1949#[to(direction = 0)]
1950pub struct ObjectUpdate {
1951    pub data: FloorItem
1952}
1953
1954#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1955#[to(direction = 0)]
1956pub struct RoomEntryInfo {
1957    pub guest_room_id: LegacyId,
1958    pub is_owner: bool
1959}
1960
1961#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1962#[to(direction = 0)]
1963pub struct RoomProperty {
1964    pub prop_type: String,
1965    pub prop_value: String
1966}
1967
1968#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
1969#[to(direction = 0)]
1970pub struct RoomVisualizationSettings {
1971    pub walls_hidden: bool,
1972    pub wall_thickness: i32,
1973    pub floor_thickness: i32
1974}
1975
1976#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
1977#[to(direction = 0)]
1978pub struct SlideObjectBundle {
1979    pub old_x: i32,
1980    pub old_y: i32,
1981    pub new_x: i32,
1982    pub new_y: i32,
1983    pub objects_z: HashMap<LegacyId, SlideObjectHeight>,
1984    pub id: LegacyId,
1985    pub avatar_movement_type: i32,
1986    pub avatar_id: LegacyId,
1987    pub avatar_old_z: LegacyDouble,
1988    pub avatar_new_z: LegacyDouble
1989}
1990
1991impl PacketVariable for SlideObjectBundle {
1992    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
1993        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
1994
1995        let (old_x, old_y, new_x, new_y, objects_z, id) = packet.read();
1996        let avatar_movement_type  = packet.read::<Option<i32>>().unwrap_or(-1);
1997
1998        (Self {
1999            old_x, old_y, new_x, new_y, objects_z, id, avatar_movement_type,
2000            avatar_id: if vec![1, 2].contains(&avatar_movement_type) { packet.read() } else { LegacyId::default() },
2001            avatar_old_z: if vec![1, 2].contains(&avatar_movement_type) { packet.read() } else { LegacyDouble::default() },
2002            avatar_new_z: if vec![1, 2].contains(&avatar_movement_type) { packet.read() } else { LegacyDouble::default() }
2003        }, packet.read_index - 6)
2004    }
2005
2006    fn to_packet(&self) -> Vec<u8> {
2007        if vec![1, 2].contains(&self.avatar_movement_type) {
2008            (
2009                self.old_x, self.old_y, self.new_x, self.new_y,
2010                self.objects_z.clone(), self.id, self.avatar_movement_type,
2011                self.avatar_id, self.avatar_old_z, self.avatar_new_z
2012            ).to_packet()
2013        } else if self.avatar_movement_type == 0 {
2014            (
2015                self.old_x, self.old_y, self.new_x, self.new_y,
2016                self.objects_z.clone(), self.id, self.avatar_movement_type
2017            ).to_packet()
2018        } else {
2019            (
2020                self.old_x, self.old_y, self.new_x, self.new_y,
2021                self.objects_z.clone(), self.id
2022            ).to_packet()
2023        }
2024    }
2025}
2026
2027#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2028#[to(direction = 0)]
2029pub struct SpecialRoomEffect {
2030    pub effect_id: LegacyId
2031}
2032
2033#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2034#[to(direction = 0)]
2035pub struct UserChange {
2036    pub id: LegacyId,
2037    pub figure: String,
2038    pub sex: String,
2039    pub custom_info: String,
2040    pub achievement_score: i32
2041}
2042
2043#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2044#[to(direction = 0)]
2045pub struct UserRemove {
2046    pub id: LegacyStringId
2047}
2048
2049#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2050#[to(direction = 0)]
2051pub struct Users {
2052    pub users: Vec<User>
2053}
2054
2055#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2056#[to(direction = 0)]
2057pub struct UserUpdate {
2058    pub users: Vec<UserUpdateMessageData>
2059}
2060
2061#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2062#[to(direction = 0)]
2063pub struct WiredFurniMove {
2064    pub old_x: i32,
2065    pub old_y: i32,
2066    pub new_x: i32,
2067    pub new_y: i32,
2068    pub old_z: LegacyDouble,
2069    pub new_z: LegacyDouble,
2070    pub furni_id: LegacyId,
2071    pub animation_time: i32
2072}
2073
2074#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2075#[to(direction = 0)]
2076pub struct WiredUserMove {
2077    pub old_x: i32,
2078    pub old_y: i32,
2079    pub new_x: i32,
2080    pub new_y: i32,
2081    pub old_z: LegacyDouble,
2082    pub new_z: LegacyDouble,
2083    pub user_id: LegacyId,
2084    pub move_type: WiredUserMoveType,
2085    pub animation_time: i32
2086}
2087
2088#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2089#[to(direction = 0)]
2090pub struct Open {
2091    pub stuff_id: LegacyId
2092}
2093
2094#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2095#[to(direction = 0)]
2096pub struct WiredFurniAction {
2097    pub def: ActionDefinition
2098}
2099
2100#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2101#[to(direction = 0)]
2102pub struct WiredFurniAddon {
2103    pub def: AddonDefinition
2104}
2105
2106#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2107#[to(direction = 0)]
2108pub struct WiredFurniCondition {
2109    pub def: ConditionDefinition
2110}
2111
2112#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2113#[to(direction = 0)]
2114pub struct WiredFurniSelector {
2115    pub def: SelectorDefinition
2116}
2117
2118#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2119#[to(direction = 0)]
2120pub struct WiredFurniTrigger {
2121    pub def: TriggerDefinition
2122}
2123
2124#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2125#[to(direction = 0)]
2126pub struct WiredRewardResult {
2127    pub reason: i32
2128}
2129
2130#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2131#[to(direction = 0)]
2132pub struct WiredSaveSuccess {}
2133
2134#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2135#[to(direction = 0)]
2136pub struct WiredValidationError {
2137    pub info: String
2138}
2139
2140#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2141#[to(direction = 0)]
2142pub struct CommunityGoalHallOfFame {
2143    pub goal_code: String,
2144    pub hof: Vec<HallOfFameEntryData>
2145}
2146
2147#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2148#[to(direction = 0)]
2149pub struct CommunityGoalProgress {
2150    pub data: CommunityGoalData
2151}
2152
2153#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2154#[to(direction = 0)]
2155pub struct ConcurrentUsersGoalProgress {
2156    pub state: i32,
2157    pub user_count: i32,
2158    pub user_count_goal: i32
2159}
2160
2161#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2162#[to(direction = 0)]
2163pub struct EpicPopup {
2164    pub image_uri: String
2165}
2166
2167#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2168#[to(direction = 0)]
2169pub struct QuestCancelled {
2170    pub expired: bool
2171}
2172
2173#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2174#[to(direction = 0)]
2175pub struct QuestCompleted {
2176    pub quest_data: QuestMessageData,
2177    pub show_dialog: bool
2178}
2179
2180#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2181#[to(direction = 0)]
2182pub struct QuestDaily {
2183    pub quest: QuestMessageData,
2184    pub easy_quest_count: i32,
2185    pub hard_quest_count: i32
2186}
2187
2188#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2189#[to(direction = 0)]
2190pub struct Quest {
2191    pub quest: QuestMessageData
2192}
2193
2194#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2195#[to(direction = 0)]
2196pub struct Quests {
2197    pub quests: Vec<QuestMessageData>,
2198    pub open_window: bool
2199}
2200
2201#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2202#[to(direction = 0)]
2203pub struct SeasonalQuests {
2204    pub quests: Vec<QuestMessageData>
2205}
2206
2207#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2208#[to(direction = 0)]
2209pub struct TalentLevelUp {
2210    pub talent_track_name: String,
2211    pub level: i32,
2212    pub reward_perks: Vec<TalentTrackRewardPerk>,
2213    pub reward_products: Vec<TalentTrackRewardProduct>
2214}
2215
2216#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2217#[to(direction = 0)]
2218pub struct TalentTrackLevel {
2219    pub talent_track_name: String,
2220    pub level: i32,
2221    pub max_level: i32
2222}
2223
2224#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2225#[to(direction = 0)]
2226pub struct TalentTrack {
2227    pub name: String,
2228    pub levels: Vec<TalentTrackLevelData>
2229}
2230
2231#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2232#[to(direction = 0)]
2233pub struct AvailabilityStatus {
2234    pub is_open: bool,
2235    pub on_shut_down: bool,
2236    pub is_authentic_habbo: Option<bool>
2237}
2238
2239#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2240#[to(direction = 0)]
2241pub struct InfoHotelClosed {
2242    pub open_hour: i32,
2243    pub open_minute: i32,
2244    pub user_thrown_out_at_close: bool
2245}
2246
2247#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2248#[to(direction = 0)]
2249pub struct InfoHotelClosing {
2250    pub minutes_until_closing: i32
2251}
2252
2253#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2254#[to(direction = 0)]
2255pub struct LoginFailedHotelClosed {
2256    pub open_hour: i32,
2257    pub open_minute: i32
2258}
2259
2260#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2261#[to(direction = 0)]
2262pub struct MaintenanceStatus {
2263    pub is_in_maintenance: bool,
2264    pub minutes_until_maintenance: i32,
2265    pub duration: Option<bool>
2266}
2267
2268#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2269#[to(direction = 0)]
2270pub struct Game2FriendsLeaderboard {
2271    pub leaderboard: Vec<LeaderBoardEntry>,
2272    pub total_list_size: i32,
2273    pub game_type_id: i32
2274}
2275
2276#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2277#[to(direction = 0)]
2278pub struct Game2TotalGroupLeaderboard {
2279    pub leaderboard: Vec<LeaderBoardEntry>,
2280    pub total_list_size: i32,
2281    pub game_type_id: i32,
2282    pub favourite_group_id: LegacyId
2283}
2284
2285#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2286#[to(direction = 0)]
2287pub struct Game2TotalLeaderboard {
2288    pub leaderboard: Vec<LeaderBoardEntry>,
2289    pub total_list_size: i32,
2290    pub game_type_id: i32
2291}
2292
2293#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2294#[to(direction = 0)]
2295pub struct Game2WeeklyFriendsLeaderboard {
2296    pub year: i32,
2297    pub week: i32,
2298    pub max_offset: i32,
2299    pub current_offset: i32,
2300    pub minutes_until_reset: i32,
2301    pub leaderboard: Vec<LeaderBoardEntry>,
2302    pub total_list_size: i32,
2303    pub game_type_id: i32
2304}
2305
2306#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2307#[to(direction = 0)]
2308pub struct Game2WeeklyGroupLeaderboard {
2309    pub year: i32,
2310    pub week: i32,
2311    pub max_offset: i32,
2312    pub current_offset: i32,
2313    pub minutes_until_reset: i32,
2314    pub leaderboard: Vec<LeaderBoardEntry>,
2315    pub total_list_size: i32,
2316    pub game_type_id: i32,
2317    pub favourite_group_id: LegacyId
2318}
2319
2320#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2321#[to(direction = 0)]
2322pub struct Game2WeeklyLeaderboard {
2323    pub year: i32,
2324    pub week: i32,
2325    pub max_offset: i32,
2326    pub current_offset: i32,
2327    pub minutes_until_reset: i32,
2328    pub leaderboard: Vec<LeaderBoardEntry>,
2329    pub total_list_size: i32,
2330    pub game_type_id: i32
2331}
2332
2333#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2334#[to(direction = 0)]
2335pub struct Game2AccountGameStatus {
2336    pub game_type_id: i32,
2337    pub free_games_left: i32,
2338    pub games_played_total: i32
2339}
2340
2341#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2342#[to(direction = 0)]
2343pub struct Game2GameCancelled {}
2344
2345#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2346#[to(direction = 0)]
2347pub struct Game2GameCreated {
2348    pub game_lobby_data: GameLobbyData
2349}
2350
2351#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2352#[to(direction = 0)]
2353pub struct Game2GameDirectoryStatus {
2354    pub status: i32,
2355    pub block_length: i32,
2356    pub games_played: i32,
2357    pub free_games_left: i32
2358}
2359
2360#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2361#[to(direction = 0)]
2362pub struct Game2GameLongData {
2363    pub game_lobby_data: GameLobbyData
2364}
2365
2366#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2367#[to(direction = 0)]
2368pub struct Game2GameStarted {
2369    pub game_lobby_data: GameLobbyData
2370}
2371
2372#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2373#[to(direction = 0)]
2374pub struct Game2InArenaQueue {
2375    pub position: i32
2376}
2377
2378#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2379#[to(direction = 0)]
2380pub struct Game2JoiningGameFailed {
2381    pub reason: i32
2382}
2383
2384#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2385#[to(direction = 0)]
2386pub struct Game2StartCounter {
2387    pub count_down_length: i32
2388}
2389
2390#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2391#[to(direction = 0)]
2392pub struct Game2StartingGameFailed {
2393    pub reason: i32
2394}
2395
2396#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2397#[to(direction = 0)]
2398pub struct Game2StopCounter {}
2399
2400#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2401#[to(direction = 0)]
2402pub struct Game2UserBlocked {
2403    pub player_block_length: i32
2404}
2405
2406#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2407#[to(direction = 0)]
2408pub struct Game2UserJoinedGame {
2409    pub user: GameLobbyPlayerData,
2410    pub was_team_switched: bool
2411}
2412
2413#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2414#[to(direction = 0)]
2415pub struct Game2UserLeftGame {
2416    pub user_id: LegacyId
2417}
2418
2419#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2420#[to(direction = 0)]
2421pub struct AcceptFriendResult {
2422    pub failures: Vec<AcceptFriendFailureData>
2423}
2424
2425#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2426#[to(direction = 0)]
2427pub struct FindFriendsProcessResult {
2428    pub success: bool
2429}
2430
2431#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2432#[to(direction = 0)]
2433pub struct FollowFriendFailed {
2434    pub error_code: i32
2435}
2436
2437#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2438#[to(direction = 0)]
2439pub struct FriendListFragment {
2440    pub total_fragments: i32,
2441    pub fragment_no: i32,
2442    pub friend_fragment: Vec<FriendData>
2443}
2444
2445#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
2446#[to(direction = 0)]
2447pub struct FriendListUpdate {
2448    pub cats: Vec<FriendCategoryData>,
2449    pub removed_friend_ids: Vec<LegacyId>,
2450    pub updated_friends: Vec<FriendData>,
2451    pub added_friends: Vec<FriendData>
2452}
2453
2454impl PacketVariable for FriendListUpdate {
2455    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
2456        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
2457
2458        let cats = packet.read();
2459        let count: LegacyLength = packet.read();
2460        let mut removed_friend_ids = Vec::new();
2461        let mut updated_friends = Vec::new();
2462        let mut added_friends = Vec::new();
2463        for _ in 0..*count {
2464            match packet.read::<i32>() {
2465                -1 => removed_friend_ids.push(packet.read()),
2466                0 => updated_friends.push(packet.read()),
2467                1 => added_friends.push(packet.read()),
2468                _ => {}
2469            }
2470        }
2471
2472        (Self {
2473            cats, removed_friend_ids, updated_friends, added_friends
2474        }, packet.read_index - 6)
2475    }
2476
2477    fn to_packet(&self) -> Vec<u8> {
2478        let mut packet = HPacket::from_header_id(0);
2479
2480        packet.append(self.cats.clone());
2481        let size = self.removed_friend_ids.len() + self.updated_friends.len() + self.added_friends.len();
2482        packet.append(LegacyLength(size as i32));
2483        for id in self.removed_friend_ids.clone() {
2484            packet.append((-1i32, id));
2485        }
2486        for friend in self.updated_friends.clone() {
2487            packet.append((0i32, friend.clone()));
2488        }
2489        for friend in self.added_friends.clone() {
2490            packet.append((0i32, friend.clone()));
2491        }
2492
2493        packet.get_bytes()[6..].to_vec()
2494    }
2495}
2496
2497#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2498#[to(direction = 0)]
2499pub struct FriendNotification {
2500    pub avatar_id: String,
2501    pub type_code: i32,
2502    pub message: String
2503}
2504
2505#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2506#[to(direction = 0)]
2507pub struct FriendRequests {
2508    pub total_req_count: i32,
2509    pub reqs: Vec<FriendRequestData>
2510}
2511
2512#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2513#[to(direction = 0)]
2514pub struct HabboSearchResult {
2515    pub friends: Vec<HabboSearchResultData>,
2516    pub others: Vec<HabboSearchResultData>
2517}
2518
2519#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2520#[to(direction = 0)]
2521pub struct InstantMessageError {
2522    pub error_code: i32,
2523    pub user_id: LegacyId,
2524    pub message: String
2525}
2526
2527#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2528#[to(direction = 0)]
2529pub struct MessengerError {
2530    pub client_message_id: i32,
2531    pub error_code: i32
2532}
2533
2534#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2535#[to(direction = 0)]
2536pub struct MessengerInit {
2537    pub user_friend_limit: i32,
2538    pub normal_friend_limit: i32,
2539    pub extended_friend_limit: i32,
2540    pub categories: Vec<FriendCategoryData>
2541}
2542
2543#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2544#[to(direction = 0)]
2545pub struct MiniMailNewMessage {}
2546
2547#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2548#[to(direction = 0)]
2549pub struct MiniMailUnreadCount {
2550    pub unread_message_count: i32
2551}
2552
2553#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2554#[to(direction = 0)]
2555pub struct NewConsole {
2556    pub sender_id: LegacyId,
2557    pub message_text: String,
2558    pub seconds_since_sent: i32,
2559    pub extra_data: String
2560}
2561
2562#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2563#[to(direction = 0)]
2564pub struct NewFriendRequest {
2565    pub req: FriendRequestData
2566}
2567
2568#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
2569#[to(direction = 0)]
2570pub struct RoomInviteError {
2571    pub error_code: i32,
2572    pub failed_recipients: Vec<LegacyId>
2573}
2574
2575impl PacketVariable for RoomInviteError {
2576    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
2577        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
2578
2579        let error_code = packet.read();
2580
2581        (Self {
2582            error_code,
2583            failed_recipients: if error_code == 1 { packet.read() } else { Vec::new() }
2584        }, packet.read_index - 6)
2585    }
2586
2587    fn to_packet(&self) -> Vec<u8> {
2588        if self.error_code == 1 {
2589            (self.error_code, self.failed_recipients.clone()).to_packet()
2590        } else {
2591            self.error_code.to_packet()
2592        }
2593    }
2594}
2595
2596#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2597#[to(direction = 0)]
2598pub struct RoomInvite {
2599    pub sender_id: LegacyId,
2600    pub message_text: String
2601}
2602
2603#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2604#[to(direction = 0)]
2605pub struct ConfirmBreedingRequest {
2606    pub nest_id: LegacyId,
2607    pub pet_1: BreedingPetInfo,
2608    pub pet_2: BreedingPetInfo,
2609    pub rarity_categories: Vec<RarityCategoryData>,
2610    pub result_pet_type: i32
2611}
2612
2613#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2614#[to(direction = 0)]
2615pub struct ConfirmBreedingResult {
2616    pub breeding_nest_stuff_id: LegacyId,
2617    pub result: i32
2618}
2619
2620#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2621#[to(direction = 0)]
2622pub struct GoToBreedingNestFailure {
2623    pub reason: i32
2624}
2625
2626#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2627#[to(direction = 0)]
2628pub struct NestBreedingSuccess {
2629    pub pet_id: LegacyId,
2630    pub rarity_category: i32
2631}
2632
2633#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2634#[to(direction = 0)]
2635pub struct PetAddedToInventory {
2636    pub pet: PetData,
2637    pub open_inventory: bool
2638}
2639
2640#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2641#[to(direction = 0)]
2642pub struct PetBreeding {
2643    pub state: i32,
2644    pub own_pet_id: LegacyId,
2645    pub other_pet_id: LegacyId
2646}
2647
2648#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2649#[to(direction = 0)]
2650pub struct PetInventory {
2651    pub total_fragments: i32,
2652    pub fragment_no: i32,
2653    pub pet_list_fragment: Vec<PetData>
2654}
2655
2656#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2657#[to(direction = 0)]
2658pub struct PetReceived {
2659    pub bought_as_gift: bool,
2660    pub pet: PetData
2661}
2662
2663#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2664#[to(direction = 0)]
2665pub struct PetRemovedFromInventory {
2666    pub pet_id: LegacyId
2667}
2668
2669#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2670#[to(direction = 0)]
2671pub struct ChangeUserNameResult {
2672    pub result_code: i32,
2673    pub name: String,
2674    pub name_suggestions: Vec<String>
2675}
2676
2677#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2678#[to(direction = 0)]
2679pub struct CheckUserNameResult {
2680    pub result_code: i32,
2681    pub name: String,
2682    pub name_suggestions: Vec<String>
2683}
2684
2685#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2686#[to(direction = 0)]
2687pub struct FigureUpdate {
2688    pub figure: String,
2689    pub gender: String
2690}
2691
2692#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2693#[to(direction = 0)]
2694pub struct Wardrobe {
2695    pub state: i32,
2696    pub outfits: Vec<OutfitData>
2697}
2698
2699#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2700#[to(direction = 0)]
2701pub struct BotAddedToInventory {
2702    pub item: BotData,
2703    pub open_inventory: bool
2704}
2705
2706#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2707#[to(direction = 0)]
2708pub struct BotInventory {
2709    pub items: Vec<BotData>
2710}
2711
2712#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2713#[to(direction = 0)]
2714pub struct BotRemovedFromInventory {
2715    pub item_id: LegacyId
2716}
2717
2718#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2719#[to(direction = 0)]
2720pub struct Achievement {
2721    pub achievement: AchievementData
2722}
2723
2724#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2725#[to(direction = 0)]
2726pub struct Achievements {
2727    pub achievements: Vec<AchievementData>,
2728    pub default_category: String
2729}
2730
2731#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2732#[to(direction = 0)]
2733pub struct AchievementsScore {
2734    pub score: i32
2735}
2736
2737#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2738#[to(direction = 0)]
2739pub struct LatencyPingResponse {
2740    pub request_id: i32
2741}
2742
2743#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2744#[to(direction = 0)]
2745pub struct JukeboxPlayListFull {}
2746
2747#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2748#[to(direction = 0)]
2749pub struct JukeboxSongDisks {
2750    pub max_length: i32,
2751    pub song_disks: HashMap<i32, i32>
2752}
2753
2754#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2755#[to(direction = 0)]
2756pub struct NowPlaying {
2757    pub current_song_id: LegacyId,
2758    pub current_position: i32,
2759    pub next_song_id: LegacyId,
2760    pub next_position: i32,
2761    pub sync_count: i32
2762}
2763
2764#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2765#[to(direction = 0)]
2766pub struct OfficialSongId {
2767    pub official_song_id: String,
2768    pub song_id: LegacyId
2769}
2770
2771#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2772#[to(direction = 0)]
2773pub struct PlayList {
2774    pub synchronization_count: i32,
2775    pub play_list: Vec<PlayListEntry>
2776}
2777
2778#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2779#[to(direction = 0)]
2780pub struct PlayListSongAdded {
2781    pub entry: PlayListEntry
2782}
2783
2784#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2785#[to(direction = 0)]
2786pub struct TraxSongInfo {
2787    pub songs: Vec<SongInfoEntry>
2788}
2789
2790#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2791#[to(direction = 0)]
2792pub struct UserSongDisksInventory {
2793    pub song_disks: HashMap<i32, i32>
2794}
2795
2796#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2797#[to(direction = 0)]
2798pub struct CreditVaultStatus {
2799    pub is_unlocked: bool,
2800    pub total_balance: i32,
2801    pub withdraw_balance: i32
2802}
2803
2804#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2805#[to(direction = 0)]
2806pub struct IncomeRewardClaimResponse {
2807    pub reward_category: i8,
2808    pub result: bool
2809}
2810
2811#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2812#[to(direction = 0)]
2813pub struct IncomeRewardStatus {
2814    pub data: Vec<IncomeReward>
2815}
2816
2817#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2818#[to(direction = 0)]
2819pub struct NavigatorCollapsedCategories {
2820    pub collapsed_categories: Vec<String>
2821}
2822
2823#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2824#[to(direction = 0)]
2825pub struct NavigatorLiftedRooms {
2826    pub lifted_rooms: Vec<LiftedRoomData>
2827}
2828
2829#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2830#[to(direction = 0)]
2831pub struct NavigatorMetaData {
2832    pub top_level_contexts: Vec<TopLevelContext>
2833}
2834
2835#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2836#[to(direction = 0)]
2837pub struct NavigatorSavedSearches {
2838    pub saved_searches: Vec<SavedSearch>
2839}
2840
2841#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2842#[to(direction = 0)]
2843pub struct NavigatorSearchResultBlocks {
2844    pub search_result: SearchResultSet
2845}
2846
2847#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2848#[to(direction = 0)]
2849pub struct NewNavigatorPreferences {
2850    pub window_x: i32,
2851    pub window_y: i32,
2852    pub window_width: i32,
2853    pub window_height: i32,
2854    pub left_pane_hidden: bool,
2855    pub results_mode: i32
2856}
2857
2858#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2859#[to(direction = 0)]
2860pub struct Game2ArenaEntered {
2861    pub player: Game2PlayerData
2862}
2863
2864#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2865#[to(direction = 0)]
2866pub struct Game2EnterArenaFailed {
2867    pub reason: i32
2868}
2869
2870#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2871#[to(direction = 0)]
2872pub struct Game2EnterArena {
2873    pub game_type: i32,
2874    pub field_type: i32,
2875    pub number_of_teams: i32,
2876    pub players: Vec<Game2PlayerData>,
2877    pub game_level: GameLevelData
2878}
2879
2880#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2881#[to(direction = 0)]
2882pub struct Game2GameChatFromPlayer {
2883    pub user_id: LegacyId,
2884    pub chat_message: String
2885}
2886
2887#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2888#[to(direction = 0)]
2889pub struct Game2GameEnding {
2890    pub time_to_next_state: i32,
2891    pub game_result: Game2GameResult,
2892    pub teams: Vec<Game2TeamScoreData>,
2893    pub general_stats: Game2SnowWarGameStats
2894}
2895
2896#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2897#[to(direction = 0)]
2898pub struct Game2GameRejoin {
2899    pub room_before_game: LegacyId
2900}
2901
2902#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2903#[to(direction = 0)]
2904pub struct Game2PlayerExitedGameArena {
2905    pub user_id: LegacyId,
2906    pub player_game_object_id: i32
2907}
2908
2909#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2910#[to(direction = 0)]
2911pub struct Game2PlayerRematches {
2912    pub user_id: LegacyId
2913}
2914
2915#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2916#[to(direction = 0)]
2917pub struct Game2StageEnding {
2918    pub time_to_next_state: i32
2919}
2920
2921#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2922#[to(direction = 0)]
2923pub struct Game2StageLoad {
2924    pub game_type: i32
2925}
2926
2927#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2928#[to(direction = 0)]
2929pub struct Game2StageRunning {
2930    pub time_to_stage_end: i32
2931}
2932
2933#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2934#[to(direction = 0)]
2935pub struct Game2StageStarting {
2936    pub game_type: i32,
2937    pub room_type: String,
2938    pub count_down: i32,
2939    pub game_objects: GameObjectsData
2940}
2941
2942#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2943#[to(direction = 0)]
2944pub struct Game2StageStillLoading {
2945    pub percentage: i32,
2946    pub finished_players: Vec<LegacyId>
2947}
2948
2949#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2950#[to(direction = 0)]
2951pub struct FigureSetIds {
2952    pub figure_set_ids: Vec<i32>,
2953    pub bound_furniture_names: Vec<String>
2954}
2955
2956#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2957#[to(direction = 0)]
2958pub struct CameraPublishStatus {
2959    pub is_ok: bool,
2960    pub get_seconds_to_wait: i32,
2961    pub get_extra_data_id: Option<String>
2962}
2963
2964#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2965#[to(direction = 0)]
2966pub struct CameraPurchaseOK {}
2967
2968#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2969#[to(direction = 0)]
2970pub struct CameraStorageUrl {
2971    pub url: String
2972}
2973
2974#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2975#[to(direction = 0)]
2976pub struct CompetitionStatus {
2977    pub is_ok: bool,
2978    pub get_error_reason: String
2979}
2980
2981#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2982#[to(direction = 0)]
2983pub struct InitCamera {
2984    pub credit_price: i32,
2985    pub ducket_price: i32,
2986    pub publish_ducket_price: Option<i32>
2987}
2988
2989#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2990#[to(direction = 0)]
2991pub struct ThumbnailStatus {
2992    pub is_ok: bool,
2993    pub is_render_limit_hit: bool
2994}
2995
2996#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
2997#[to(direction = 0)]
2998pub struct AvatarEffectActivated {
2999    pub effect_type: i32,
3000    pub duration: i32,
3001    pub is_permanent: bool
3002}
3003
3004#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3005#[to(direction = 0)]
3006pub struct AvatarEffectAdded {
3007    pub effect_type: i32,
3008    pub sub_type: i32,
3009    pub duration: i32,
3010    pub is_permanent: bool
3011}
3012
3013#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3014#[to(direction = 0)]
3015pub struct AvatarEffectExpired {
3016    pub effect_type: i32
3017}
3018
3019#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3020#[to(direction = 0)]
3021pub struct AvatarEffectSelected {
3022    pub effect_type: i32
3023}
3024
3025#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3026#[to(direction = 0)]
3027pub struct AvatarEffects {
3028    pub effects: Vec<AvatarEffectData>
3029}
3030
3031#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3032#[to(direction = 0)]
3033pub struct UserNftWardrobe {
3034    pub nft_avatars: Vec<NftWardrobeItem>
3035}
3036
3037#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3038#[to(direction = 0)]
3039pub struct UserNftWardrobeSelection {
3040    pub current_token_id: String,
3041    pub fallback_figure_string: String,
3042    pub fallback_gender: String
3043}
3044
3045#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3046#[to(direction = 0)]
3047pub struct AvatarEffect {
3048    pub user_id: LegacyId,
3049    pub effect_id: i32,
3050    pub delay_milli_seconds: i32
3051}
3052
3053#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3054#[to(direction = 0)]
3055pub struct CarryObject {
3056    pub user_id: LegacyId,
3057    pub item_type: i32
3058}
3059
3060#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3061#[to(direction = 0)]
3062pub struct Dance {
3063    pub user_id: LegacyId,
3064    pub dance_style: i32
3065}
3066
3067#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3068#[to(direction = 0)]
3069pub struct Expression {
3070    pub user_id: LegacyId,
3071    pub expression_type: i32
3072}
3073
3074#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3075#[to(direction = 0)]
3076pub struct Sleep {
3077    pub user_id: LegacyId,
3078    pub sleeping: bool
3079}
3080
3081#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3082#[to(direction = 0)]
3083pub struct UseObject {
3084    pub user_id: LegacyId,
3085    pub item_type: i32
3086}
3087
3088#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3089#[to(direction = 0)]
3090pub struct ActivityPoints {
3091    pub points: HashMap<i32, i32>
3092}
3093
3094#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3095#[to(direction = 0)]
3096pub struct ClubGiftNotification {
3097    pub num_gifts: i32
3098}
3099
3100#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3101#[to(direction = 0)]
3102pub struct ElementPointer {
3103    pub key: String
3104}
3105
3106#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3107#[to(direction = 0)]
3108pub struct HabboAchievementNotification {
3109    pub data: AchievementLevelUpData
3110}
3111
3112#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3113#[to(direction = 0)]
3114pub struct HabboActivityPointNotification {
3115    pub amount: i32,
3116    pub change: i32,
3117    pub point_type: i32
3118}
3119
3120#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3121#[to(direction = 0)]
3122pub struct HabboBroadcast {
3123    pub message_text: String
3124}
3125
3126#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3127#[to(direction = 0)]
3128pub struct InfoFeedEnable {
3129    pub enabled: bool
3130}
3131
3132#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3133#[to(direction = 0)]
3134pub struct MOTDNotification {
3135    pub messages: Vec<String>
3136}
3137
3138#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3139#[to(direction = 0)]
3140pub struct NotificationDialog {
3141    pub dialog_type: String,
3142    pub parameters: HashMap<String, String>
3143}
3144
3145#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3146#[to(direction = 0)]
3147pub struct OfferRewardDelivered {
3148    pub content_type: String,
3149    pub class_id: i32,
3150    pub name: String,
3151    pub description: String
3152}
3153
3154#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3155#[to(direction = 0)]
3156pub struct PetLevelNotification {
3157    pub pet_id: LegacyId,
3158    pub pet_name: String,
3159    pub level: i32,
3160    pub figure_data: PetFigureData
3161}
3162
3163#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3164#[to(direction = 0)]
3165pub struct RestoreClient {}
3166
3167#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3168#[to(direction = 0)]
3169pub struct UnseenItems {
3170    pub categories: HashMap<i32, Vec<i32>>
3171}
3172
3173#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3174#[to(direction = 0)]
3175pub struct AccountPreferences {
3176    pub ui_volume: i32,
3177    pub furni_volume: i32,
3178    pub trax_volume: i32,
3179    pub free_flow_chat_disabled: bool,
3180    pub room_invites_ignored: bool,
3181    pub room_camera_follow_disabled: bool,
3182    pub ui_flags: i32,
3183    pub prefered_chat_style: i32
3184}
3185
3186#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3187#[to(direction = 0)]
3188pub struct TradeOpenFailed {
3189    pub reason: i32,
3190    pub other_user_name: String
3191}
3192
3193#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3194#[to(direction = 0)]
3195pub struct TradingAccept {
3196    pub user_id: LegacyId,
3197    pub user_accepts: i32
3198}
3199
3200#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3201#[to(direction = 0)]
3202pub struct TradingClose {
3203    pub user_id: LegacyId,
3204    pub reason: i32
3205}
3206
3207#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3208#[to(direction = 0)]
3209pub struct TradingCompleted {}
3210
3211#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3212#[to(direction = 0)]
3213pub struct TradingConfirmation {}
3214
3215#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3216#[to(direction = 0)]
3217pub struct TradingItemList {
3218    pub first_user_id: LegacyId,
3219    pub first_user_item_array: Vec<ItemDataStructure>,
3220    pub first_user_num_items: i32,
3221    pub first_user_num_credits: i32,
3222    pub second_user_id: LegacyId,
3223    pub second_user_item_array: Vec<ItemDataStructure>,
3224    pub second_user_num_items: i32,
3225    pub second_user_num_credits: i32,
3226}
3227
3228#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3229#[to(direction = 0)]
3230pub struct TradingNotOpen {}
3231
3232#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3233#[to(direction = 0)]
3234pub struct TradingOpen {
3235    pub user_id: LegacyId,
3236    pub user_can_trade: i32,
3237    pub other_user_id: LegacyId,
3238    pub other_user_can_trade: i32
3239}
3240
3241#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3242#[to(direction = 0)]
3243pub struct TradingOtherNotAllowed {}
3244
3245#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3246#[to(direction = 0)]
3247pub struct TradingYouAreNotAllowed {}
3248
3249#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3250#[to(direction = 0)]
3251pub struct CitizenshipVipOfferPromoEnabled {}
3252
3253#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3254#[to(direction = 0)]
3255pub struct PerkAllowances {
3256    pub perks: Vec<Perk>
3257}
3258
3259#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3260#[to(direction = 0)]
3261pub struct BotError {
3262    pub error_code: i32
3263}
3264
3265#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3266#[to(direction = 0)]
3267pub struct BotForceOpenContextMenu {
3268    pub bot_id: LegacyId
3269}
3270
3271#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3272#[to(direction = 0)]
3273pub struct BotSkillListUpdate {
3274    pub bot_id: LegacyId,
3275    pub skills: Vec<BotSkillData>
3276}
3277
3278#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3279#[to(direction = 0)]
3280pub struct FriendFurniCancelLock {
3281    pub stuff_id: LegacyId
3282}
3283
3284#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3285#[to(direction = 0)]
3286pub struct FriendFurniOtherLockConfirmed {
3287    pub stuff_id: LegacyId
3288}
3289
3290#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3291#[to(direction = 0)]
3292pub struct FriendFurniStartConfirmation {
3293    pub stuff_id: LegacyId,
3294    pub is_owner: bool
3295}
3296
3297#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3298#[to(direction = 0)]
3299pub struct CfhSanction {
3300    pub issue_id: LegacyId,
3301    pub account_id: LegacyId,
3302    pub sanction_type: CfhSanctionTypeData
3303}
3304
3305#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3306#[to(direction = 0)]
3307pub struct CfhTopicsInit {
3308    pub call_for_help_categories: Vec<CallForHelpCategoryData>
3309}
3310
3311#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3312#[to(direction = 0)]
3313pub struct SanctionStatus {
3314    pub is_sanction_new: bool,
3315    pub is_sanction_active: bool,
3316    pub sanction_name: String,
3317    pub sanction_length_hours: i32,
3318    pub _unused1: i32,
3319    pub sanction_reason: String,
3320    pub sanction_creation_time: String,
3321    pub probation_hours_left: i32,
3322    pub next_sanction_name: String,
3323    pub next_sanction_length_hours: i32,
3324    pub _unused2: i32,
3325    pub has_custom_mute: bool,
3326    pub trade_lock_expiry_time: Option<String>
3327}
3328
3329#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3330#[to(direction = 0)]
3331pub struct CreditBalance {
3332    pub balance: LegacyStringId
3333}
3334
3335#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3336#[to(direction = 0)]
3337pub struct BannedUsersFromRoom {
3338    pub room_id: LegacyId,
3339    pub banned_users: Vec<BannedUserData>
3340}
3341
3342#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3343#[to(direction = 0)]
3344pub struct FlatControllerAdded {
3345    pub flat_id: LegacyId,
3346    pub data: FlatControllerData
3347}
3348
3349#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3350#[to(direction = 0)]
3351pub struct FlatControllerRemoved {
3352    pub flat_id: LegacyId,
3353    pub user_id: LegacyId
3354}
3355
3356#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3357#[to(direction = 0)]
3358pub struct FlatControllers {
3359    pub room_id: LegacyId,
3360    pub controllers: Vec<FlatControllerData>
3361}
3362
3363#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3364#[to(direction = 0)]
3365pub struct MuteAllInRoom {
3366    pub all_muted: bool
3367}
3368
3369#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3370#[to(direction = 0)]
3371pub struct NoSuchFlat {
3372    pub flat_id: LegacyId
3373}
3374
3375#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3376#[to(direction = 0)]
3377pub struct RoomSettingsData {
3378    pub room_id: LegacyId,
3379    pub name: String,
3380    pub description: String,
3381    pub door_mode: i32,
3382    pub category_id: i32,
3383    pub maximum_visitors: i32,
3384    pub maximum_visitors_limit: i32,
3385    pub tags: Vec<String>,
3386    pub trade_mode: i32,
3387    pub allow_pets: i32,
3388    pub allow_food_consume: i32,
3389    pub allow_walk_through: i32,
3390    pub hide_walls: i32,
3391    pub wall_thickness: i32,
3392    pub floor_thickness: i32,
3393    pub chat_settings: RoomChatSettings,
3394    pub allow_navigator_dynamic_cats: bool,
3395    pub room_moderation_settings: RoomModerationSettings
3396}
3397
3398#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3399#[to(direction = 0)]
3400pub struct RoomSettingsError {
3401    pub room_id: LegacyId,
3402    pub error_code: i32
3403}
3404
3405#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3406#[to(direction = 0)]
3407pub struct RoomSettingsSaved {
3408    pub room_id: LegacyId
3409}
3410
3411#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3412#[to(direction = 0)]
3413pub struct RoomSettingsSaveError {
3414    pub room_id: LegacyId,
3415    pub error_code: i32,
3416    pub info: String
3417}
3418
3419#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3420#[to(direction = 0)]
3421pub struct ShowEnforceRoomCategoryDialog {
3422    pub selection_type: i32
3423}
3424
3425#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3426#[to(direction = 0)]
3427pub struct UserUnbannedFromRoom {
3428    pub room_id: LegacyId,
3429    pub user_id: LegacyId
3430}
3431
3432#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3433#[to(direction = 0)]
3434pub struct Game2FullGameStatus {
3435    pub full_status: FullGameStatusData
3436}
3437
3438#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3439#[to(direction = 0)]
3440pub struct Game2GameStatus {
3441    pub status: GameStatusData
3442}
3443
3444#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3445#[to(direction = 0)]
3446pub struct PetBreedingResult {
3447    pub result_data: PetBreedingResultData,
3448    pub other_result_data: PetBreedingResultData
3449}
3450
3451#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3452#[to(direction = 0)]
3453pub struct PetCommands {
3454    pub pet_id: LegacyId,
3455    pub all_commands: Vec<i32>,
3456    pub enabled_commands: Vec<i32>
3457}
3458
3459#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3460#[to(direction = 0)]
3461pub struct PetExperience {
3462    pub pet_id: LegacyId,
3463    pub pet_room_index: i32,
3464    pub gained_experience: i32
3465}
3466
3467#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3468#[to(direction = 0)]
3469pub struct PetFigureUpdate {
3470    pub room_index: i32,
3471    pub pet_id: LegacyId,
3472    pub figure_data: PetFigureData,
3473    pub has_saddle: bool,
3474    pub is_riding: bool
3475}
3476
3477#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3478#[to(direction = 0)]
3479pub struct PetInfo {
3480    pub pet_id: LegacyId,
3481    pub name: String,
3482    pub level: i32,
3483    pub max_level: i32,
3484    pub experience: i32,
3485    pub experience_required_to_level: i32,
3486    pub energy: i32,
3487    pub max_energy: i32,
3488    pub nutrition: i32,
3489    pub max_nutrition: i32,
3490    pub respect: i32,
3491    pub owner_id: LegacyId,
3492    pub age: i32,
3493    pub owner_name: String,
3494    pub breed_id: i32,
3495    pub has_free_saddle: bool,
3496    pub is_riding: bool,
3497    pub skill_tresholds: Vec<i32>,
3498    pub access_rights: i32,
3499    pub can_breed: bool,
3500    pub can_harvest: bool,
3501    pub can_revive: bool,
3502    pub rarity_level: i32,
3503    pub max_well_being_seconds: i32,
3504    pub remaining_well_bein_seconds: i32,
3505    pub remaining_growing_seconds: i32,
3506    pub has_breeding_permission: bool
3507}
3508
3509#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3510#[to(direction = 0)]
3511pub struct PetLevelUpdate {
3512    pub room_index: i32,
3513    pub pet_id: LegacyId,
3514    pub level: i32
3515}
3516
3517#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3518#[to(direction = 0)]
3519pub struct PetPlacingError {
3520    pub error_code: i32
3521}
3522
3523#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3524#[to(direction = 0)]
3525pub struct PetRespectFailed {
3526    pub required_days: i32,
3527    pub avatar_age_in_days: i32
3528}
3529
3530#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3531#[to(direction = 0)]
3532pub struct PetStatusUpdate {
3533    pub room_index: i32,
3534    pub pet_id: LegacyId,
3535    pub can_breed: bool,
3536    pub can_harvest: bool,
3537    pub can_revive: bool,
3538    pub has_breeding_permission: bool
3539}
3540
3541#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3542#[to(direction = 0)]
3543pub struct BadgePointLimits {
3544    pub data: HashMap<String, Vec<BadgeAndPointLimit>>
3545}
3546
3547#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3548#[to(direction = 0)]
3549pub struct BadgeReceived {
3550    pub badge_id: i32,
3551    pub badge_code: String
3552}
3553
3554#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3555#[to(direction = 0)]
3556pub struct Badges {
3557    pub total_fragments: i32,
3558    pub fragment_no: i32,
3559    pub current_fragment: HashMap<i32, String>
3560}
3561
3562#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3563#[to(direction = 0)]
3564pub struct IsBadgeRequestFulfilled {
3565    pub request_code: String,
3566    pub fulfilled: bool
3567}
3568
3569#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3570#[to(direction = 0)]
3571pub struct NewUserExperienceGiftOffer {
3572    pub gift_options: Vec<NewUserExperienceGiftOptions>
3573}
3574
3575#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3576#[to(direction = 0)]
3577pub struct NewUserExperienceNotComplete {}
3578
3579#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3580#[to(direction = 0)]
3581pub struct MarketplaceBuyOfferResult {
3582    pub result: i32,
3583    pub offer_id: LegacyId,
3584    pub new_price: i32,
3585    pub requested_offer_id: LegacyId
3586}
3587
3588#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3589#[to(direction = 0)]
3590pub struct MarketplaceCancelOfferResult {
3591    pub offer_id: LegacyId,
3592    pub success: bool
3593}
3594
3595#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3596#[to(direction = 0)]
3597pub struct MarketplaceCanMakeOfferResult {
3598    pub result_code: i32,
3599    pub token_count: i32
3600}
3601
3602#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3603#[to(direction = 0)]
3604pub struct MarketplaceConfiguration {
3605    pub is_enabled: bool,
3606    pub commission: i32,
3607    pub token_batch_price: i32,
3608    pub token_batch_size: i32,
3609    pub offer_min_price: i32,
3610    pub offer_max_price: i32,
3611    pub expiration_hours: i32,
3612    pub average_price_period: i32,
3613    pub selling_fee_percentage: i32,
3614    pub revenue_limit: i32,
3615    pub half_tax_limit: i32
3616}
3617
3618#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3619#[to(direction = 0)]
3620pub struct MarketplaceItemStats {
3621    pub average_price: i32,
3622    pub offer_count: i32,
3623    pub history_length: i32,
3624    pub data: Vec<MarketplaceItemStatsData>,
3625    pub furni_category_id: i32,
3626    pub furni_type_id: i32
3627}
3628
3629#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3630#[to(direction = 0)]
3631pub struct MarketplaceMakeOfferResult {
3632    pub result: i32
3633}
3634
3635#[derive(BaseParser, Clone, Debug, Default, PartialEq)]
3636#[to(direction = 0)]
3637pub struct MarketPlaceOffers {
3638    pub offers: Vec<MarketPlaceOffer>,
3639    pub total_items_found: i32
3640}
3641
3642impl PacketVariable for MarketPlaceOffers {
3643    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
3644        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
3645
3646        let mut offers: Vec<MarketPlaceOffer> = Vec::new();
3647        for _ in 0..*packet.read::<LegacyLength>() {
3648            let mut offer: MarketPlaceOffer = packet.read();
3649            offer.offer_count = packet.read();
3650            offers.push(offer);
3651        }
3652        let total_items_found = packet.read();
3653
3654        (Self {
3655            offers, total_items_found
3656        }, packet.read_index - 6)
3657    }
3658
3659    fn to_packet(&self) -> Vec<u8> {
3660        let mut packet = HPacket::from_header_id(0);
3661
3662        for offer in self.offers.clone() {
3663            packet.append((offer.clone(), offer.offer_count));
3664        }
3665        packet.append(self.total_items_found);
3666
3667        packet.get_bytes()[6..].to_vec()
3668    }
3669}
3670
3671#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3672#[to(direction = 0)]
3673pub struct MarketPlaceOwnOffers {
3674    pub credits_waiting: i32,
3675    pub offers: Vec<MarketPlaceOffer>
3676}
3677
3678#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3679#[to(direction = 0)]
3680pub struct CommunityVoteReceived {
3681    pub acknowledged: bool
3682}
3683
3684#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3685#[to(direction = 0)]
3686pub struct UserClassification {
3687    pub classified_users: Vec<ClassifiedUser>
3688}
3689
3690#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3691#[to(direction = 0)]
3692pub struct ItemStateUpdate {
3693    pub id: LegacyId,
3694    pub item_data: String
3695}
3696
3697#[derive(BaseParser, Clone, Debug, Default, PacketVariable, PartialEq)]
3698#[to(direction = 0)]
3699pub struct WiredWallItemMove {
3700    pub id: LegacyId,
3701    pub is_direction_right: bool,
3702    pub old_wall_x: i32,
3703    pub old_wall_y: i32,
3704    pub old_offset_x: i32,
3705    pub old_offset_y: i32,
3706    pub new_wall_x: i32,
3707    pub new_wall_y: i32,
3708    pub new_offset_x: i32,
3709    pub new_offset_y: i32,
3710    pub animation_time: i32
3711}