Pol  Revision:cb584c9
pktboth.h
Go to the documentation of this file.
1 
12 #ifndef __PKTBOTHH
13 #define __PKTBOTHH
14 
15 #include "../clib/rawtypes.h"
16 #include "pktbothid.h"
17 #include "pktdef.h"
18 namespace Pol
19 {
20 namespace Core
21 {
22 #pragma pack( push, 1 )
23 
24 // Walk Approved
26 {
30 };
31 static_assert( sizeof( PKTBI_22_APPROVED ) == 3, "size missmatch" );
32 
33 // Walk Resync Requested By Client
35 {
39 };
40 static_assert( sizeof( PKTBI_22_SYNC ) == 3, "size missmatch" );
41 
42 /* Message 2C: A little bit strange.
43 First, the server sends "2C 00" to the client, to tell it it's dead.
44 Next, the client pops up the res menu.
45 Next, the user picks. If the user picks ghost, the client sends "2C 02" - "2C 01" if instares.
46 Now, while a ghost, it seems the client transmits "2C 00" in front of MSG72 "war mode"
47 messages. Not sure why.
48 */
49 struct PKTBI_2C
50 {
53 };
54 static_assert( sizeof( PKTBI_2C ) == 2, "size missmatch" );
55 
56 // All Names
58 {
62 };
63 static_assert( sizeof( PKTBI_98_IN ) == 7, "size missmatch" );
64 
65 // All Names
66 // struct PKTBI_98_OUT
67 //{
68 // u8 msgtype;
69 // u16 msglen;
70 // u32 serial;
71 // char name[30];
72 //};
73 // static_assert( sizeof(PKTBI_98_OUT) == 37, "size missmatch" );
74 
75 /* NOTE on MSG3A:
76  send the header, plus skills[] for each skill,
77  plus two zeros in 'skillid' after all the skills
78  sent.
79  I'm not sure if it's OK to only send a few skills.
80  */
82 {
86  struct
87  {
92  } skills[100];
93  enum
94  {
95  LOCK_NONE = 0,
96  LOCK_DOWN = 1,
97  LOCK_LOCKED = 2
98  };
99  enum
100  {
101  FULL_LIST = 0x00,
102  FULL_LIST_CAP = 0x02,
103  SINGLE_SKILL = 0xFF,
104  SINGLE_SKILL_CAP = 0xDF
105  };
107 };
108 
110 // struct PKTBI_3A_CAPS
111 //{
112 // u8 msgtype;
113 // u16 msglen;
114 // u8 unk3;
115 // struct
116 // {
117 // u16 skillid;
118 // u16 value;
119 // u16 value_unmod;
120 // u8 lock_mode;
121 // u16 cap;
122 // } skills[100];//SKILLID__CLIENT_HIGHEST - SKILLID__CLIENT_LOWEST + 1 ];
123 // enum { LOCK_NONE = 0, LOCK_DOWN = 1, LOCK_LOCKED = 2 };
124 // //u16 terminator;
125 //};
126 
128 {
133 };
134 static_assert( sizeof( PKTBI_3A_LOCKS ) == 6, "size missmatch" );
135 
136 struct PKTBI_3B
137 {
142  enum
143  {
144  STATUS_NOTHING_BOUGHT = 0,
145  STATUS_ITEMS_BOUGHT = 2
146  };
147  struct
148  {
152  } items[1]; /* Dunno how many it should be */
153 };
154 static_assert( sizeof( PKTBI_3B ) == 15, "size missmatch" );
155 
156 struct PKTBI_56
157 {
164  enum
165  {
166  TYPE_ADD = 1,
172  TYPE_TOGGLE_RESPONSE
173  };
174 };
175 static_assert( sizeof( PKTBI_56 ) == 11, "size missmatch" );
176 
177 struct PKTBI_66
178 {
185  char text[1];
186 };
187 static_assert( sizeof( PKTBI_66 ) == 14, "size missmatch" );
188 
189 // struct PKTBI_66_HDR
190 //{
191 // u8 msgtype;
192 // u16 msglen;
193 // u32 book_serial;
194 // u16 pages;
195 //};
196 // static_assert( sizeof( PKTBI_66_HDR ) == 9, "size missmatch" );
197 //
198 // struct PKTBI_66_CONTENTS
199 //{
200 // u16 page;
201 // u16 lines;
202 //};
203 // static_assert( sizeof( PKTBI_66_CONTENTS ) == 4, "size missmatch" );
204 
205 struct PKTBI_6C
206 {
208  u8 unk1; // TARGET_CURSOR_CREATE / _DELETE ??
215  s8 z;
217  enum
218  {
220  UNK1_01
221  };
223  {
224  CURSOR_TYPE_OBJECT = 0,
225  CURSOR_TYPE_COORDINATE = 1,
226 
227  CURSOR_TYPE_NEUTRAL = 0,
228  CURSOR_TYPE_HARMFUL = 1,
229  CURSOR_TYPE_HELPFUL = 2
230  };
231 };
232 static_assert( sizeof( PKTBI_6C ) == 19, "size missmatch" );
233 
234 struct PKTBI_6F
235 {
243  char name[30];
244 
245  enum
246  {
247  ACTION_INIT = 0,
248  ACTION_CANCEL = 1,
249  ACTION_STATUS = 2
250  };
251 };
252 static_assert( sizeof( PKTBI_6F ) == 47, "size missmatch" );
253 
254 struct PKTBI_71
255 {
256  // One of these...
257  struct HEADER
258  {
262  };
263 
264  enum SUBCMDs
265  {
266  OUT_0_DISPLAY_BOARD = 0,
267  OUT_1_MESSAGE_SUMMARY = 1,
268  OUT_2_MESSAGE = 2,
269  IN_3_REQ_MESSAGE = 3,
270  IN_4_REQ_MESSAGE_SUMMARY = 4,
271  IN_5_POST_MESSAGE = 5,
272  IN_6_REMOVE_MESSAGE = 6
273  };
274 
275  // Followed by a sub-cmd block...
277  {
279  char name[22];
280  u32 id; // always 0x402000FF ?
281  u32 unk_00; // always 0x00
282  };
283 
285  {
288  u32 parent_id; // 0 if top-level
289  struct POSTER
290  {
292  char poster[1]; // post_len bytes long (null term)
293  };
294  struct SUBJECT
295  {
297  char subject[1]; // subj_len bytes long (null term)
298  };
299  struct TIME
300  {
302  char time[1]; // time_len bytes long (null term)
303  };
304  };
305 
307  {
310  struct POSTER
311  {
313  char poster[1]; // post_len bytes long (nullptr term)
314  };
315  struct SUBJECT
316  {
318  char subject[1]; // subj_len bytes long (null term)
319  };
320  struct TIME
321  {
323  char time[1]; // time_len bytes long (null term)
324  };
325  struct LINE_HEADER
326  {
327  // 01 91 84 0A 06 1E FD 01 0B 15 2E 01 0B 17 0B
328  // 01 BB 20 46 04 66 13 F8 00 00 0E 75 00 00
329  u8 constant_hdr[29]; // use MSG71_SUBCMD_2_CONSTANT to initialise
331  };
332  struct LINES
333  {
335  char body[1]; // line_len bytes long (null term)
336  };
337  };
338 
340  {
343  };
344 
346  {
349  };
350 
352  {
354  u32 reply_id; // 0 for top-level or if not a reply
355  struct SUBJECT
356  {
358  char subject[1]; // subj_len bytes long (null term)
359  };
360  struct LINE_HEADER
361  {
363  };
364  struct LINES
365  {
367  char body[1]; // line_len bytes long (null term)
368  };
369  };
370 
372  {
375  };
376 };
377 static_assert( sizeof( PKTBI_71::HEADER ) == 4, "size missmatch" );
378 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_0_DISPLAY_BOARD ) == 34, "size missmatch" );
379 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_1_MESSAGE_SUMMARY::POSTER ) == 2, "size missmatch" );
380 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_1_MESSAGE_SUMMARY::SUBJECT ) == 2, "size missmatch" );
381 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_1_MESSAGE_SUMMARY::TIME ) == 2, "size missmatch" );
382 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_2_MESSAGE::POSTER ) == 2, "size missmatch" );
383 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_2_MESSAGE::SUBJECT ) == 2, "size missmatch" );
384 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_2_MESSAGE::TIME ) == 2, "size missmatch" );
385 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_2_MESSAGE::LINE_HEADER ) == 30, "size missmatch" );
386 static_assert( sizeof( PKTBI_71::SUBCMD_OUT_2_MESSAGE::LINES ) == 2, "size missmatch" );
387 static_assert( sizeof( PKTBI_71::SUBCMD_IN_3_REQ_MESSAGE ) == 8, "size missmatch" );
388 static_assert( sizeof( PKTBI_71::SUBCMD_IN_4_REQ_MESSAGE_SUMMARY ) == 8, "size missmatch" );
389 static_assert( sizeof( PKTBI_71::SUBCMD_IN_5_POST_MESSAGE::SUBJECT ) == 2, "size missmatch" );
390 static_assert( sizeof( PKTBI_71::SUBCMD_IN_5_POST_MESSAGE::LINE_HEADER ) == 1, "size missmatch" );
391 static_assert( sizeof( PKTBI_71::SUBCMD_IN_5_POST_MESSAGE::LINES ) == 2, "size missmatch" );
392 static_assert( sizeof( PKTBI_71::SUBCMD_IN_6_REMOVE_MESSAGE ) == 8, "size missmatch" );
393 
394 struct PKTBI_72
395 {
397  u8 warmode; /* 00 = not, 01 = war mode */
401 };
402 static_assert( sizeof( PKTBI_72 ) == 5, "size missmatch" );
403 
404 struct PKTBI_73
405 {
408 };
409 static_assert( sizeof( PKTBI_73 ) == 2, "size missmatch" );
410 
411 struct PKTBI_93
412 {
418  char title[60];
419  char author[30];
420 };
421 static_assert( sizeof( PKTBI_93 ) == 99, "size missmatch" );
422 
423 struct PKTBI_95
424 {
429 };
430 static_assert( sizeof( PKTBI_95 ) == 9, "size missmatch" );
431 
432 struct PKTBI_99
433 {
437  u8 unk_x06_x11[12];
442 };
443 static_assert( sizeof( PKTBI_99 ) == 26, "size missmatch" );
444 
445 struct PKTBI_9A
446 {
452  char text[1];
453 };
454 static_assert( sizeof( PKTBI_9A ) == 16, "size missmatch" );
455 
457 {
459 };
460 static_assert( sizeof( PKTBI_B8_IN_REQUEST ) == 4, "size missmatch" );
461 
463 {
467  u16 wtext[2];
468 };
469 static_assert( sizeof( PKTBI_B8_IN_UPDATE ) == 12, "size missmatch" );
470 
472 {
476  union {
479  };
480  enum
481  {
482  MODE_REQUEST = 0,
483  MODE_UPDATE = 1
484  };
485 };
486 
487 // struct PKTBI_B8_OUT {
488 // u8 msgtype;
489 // u16 msglen;
490 // u32 serial;
491 // char text[5*(SPEECH_MAX_LEN+1)]; // 1 Ascii variable array ( SPEECH_MAX_LEN+1) and 2 Unicode
492 // variable arrays 2*(SPEECH_MAX_LEN+1) each due to u16.
493 //};
494 // static_assert( sizeof(PKTBI_B8_OUT) == 1012, "size missmatch" );
495 
496 struct PKTBI_BB
497 {
501 };
502 static_assert( sizeof( PKTBI_BB ) == 9, "size missmatch" );
503 
504 struct PKTBI_BD
505 {
508  char version[1];
509 };
510 static_assert( sizeof( PKTBI_BD ) == 4, "size missmatch" );
511 
513 {
515  u32 buttonid; // response for 0xB1
516 };
517 
519 {
520  u16 unk1; // always 0
524 };
525 
527 {
529 };
530 static_assert( sizeof( PKTBI_BF_06_01_IN ) == 4, "size missmatch" );
531 
532 // struct PKTBI_BF_06_01_OUT
533 //{
534 // u8 nummembers;
535 // struct {
536 // u32 memberid;
537 // } serials[ 1 ];
538 //};
539 // static_assert( sizeof(PKTBI_BF_06_01_OUT) == 5, "size missmatch" );
540 
542 {
544 };
545 
546 // struct PKTBI_BF_06_02_OUT
547 //{
548 // u8 nummembers; //total nr of new party
549 // u32 remmemberid; //removed Player
550 // struct {
551 // u32 memberid;
552 // } serials[ 1 ]; //party members
553 //};
554 // static_assert( sizeof(PKTBI_BF_06_02_OUT) == 9, "size missmatch" );
555 
556 // struct PKTBI_BF_06_02_LIST
557 //{
558 // u8 nummembers;
559 // u32 remmemberid;
560 //};
561 // static_assert( sizeof(PKTBI_BF_06_02_LIST) == 5, "size missmatch" );
562 
564 {
565  u32 memberid; //(of target, from client, of source, from server)
566  u16 wtext[2]; // wide-character, double-null terminated
567 };
568 static_assert( sizeof( PKTBI_BF_06_03 ) == 8, "size missmatch" );
569 
571 {
572  u16 wtext[2]; // wide-character, double-null terminated
573 };
574 static_assert( sizeof( PKTBI_BF_06_04_IN ) == 4, "size missmatch" );
575 
576 // struct PKTBI_BF_06_04_OUT
577 //{
578 // u32 memberid;
579 // u16 wtext[(SPEECH_MAX_LEN) + 1]; // wide-character, double-null terminated
580 //};
581 // static_assert( sizeof(PKTBI_BF_06_04_OUT) == 406, "size missmatch" );
582 
584 {
585  u8 canloot; // 0,1
586  enum
587  {
588  CANLOOT_YES = 1,
589  CANLOOT_NO = 0
590  };
591 };
592 static_assert( sizeof( PKTBI_BF_06_06 ) == 1, "size missmatch" );
593 
594 // struct PKTBI_BF_06_07
595 //{
596 // u32 leaderid;
597 //};
598 // static_assert( sizeof(PKTBI_BF_06_07) == 4, "size missmatch" );
599 
601 {
603 };
604 static_assert( sizeof( PKTBI_BF_06_08 ) == 4, "size missmatch" );
605 
607 {
609 };
610 static_assert( sizeof( PKTBI_BF_06_09 ) == 4, "size missmatch" );
611 
613 {
615  union {
617  // PKTBI_BF_06_01_OUT partyaddout; //server
619  // PKTBI_BF_06_02_OUT partyremoveout; //server
620  // PKTBI_BF_06_02_LIST partyemptylist; //server
621  PKTBI_BF_06_03 partymembermsg; // client/server
623  // PKTBI_BF_06_04_OUT partymsgout; //server
625  // PKTBI_BF_06_07 invitemember; //server
628  };
629  enum
630  {
631  PARTYCMD_ADD = 1,
632  PARTYCMD_REMOVE = 2,
633  PARTYCMD_MEMBER_MSG = 3,
634  PARTYCMD_PARTY_MSG = 4,
635  PARTYCMD_LOOT_PERMISSION = 6,
636  PARTYCMD_INVITE_MEMBER = 7,
637  PARTYCMD_ACCEPT_INVITE = 8,
638  PARTYCMD_DECLINE_INVITE = 9
639  };
640 };
641 
643 {
644  u8 unk1; // 0x0a
646 };
647 
649 {
652 };
653 
654 // TextID is broken into two decimal parts:
655 // stringID / 1000: intloc fileID
656 // stringID % 1000: text index
657 // So, say you want the 123rd text entry of intloc06, the stringID would be 6123
659 {
663  // if flags & 0x20:
664  u16 color; // rgb 1555 color (ex, 0 = transparent, 0x8000 = solid black, 0x1F = blue, 0x3E0 =
665  // green, 0x7C00 = red)
666 
667  enum
668  {
669  POPUP_MENU_LOCKED = 0x1,
670  POPUP_MENU_ARROW = 0x2,
671  POPUP_MENU_COLOR = 0x20
672  };
673 };
674 
676 {
677  u16 unk; // always 00 01
681 };
682 
684 {
687 };
688 
689 // struct PKTBI_BF_16
690 //{
691 // u32 window_id;
692 // u32 serial; // Char serial ( if window_id = CONTAINER this is container serial )
693 //
694 // enum
695 // {
696 // PAPERDOLL = 0x1,
697 // STATUS = 0x2,
698 // CHARPROFILE = 0x8,
699 // CONTAINER = 0xC
700 // };
701 //};
702 
703 // Shows codex of wisdom's text #msg. (msg is linearised (including sub indices) index number
704 // starting with 1)
706 {
707  u8 unk; // always 1
709  u8 mode; //(0: "?" flashing, 1: directly opening)
710 };
711 
712 // struct PKTBI_BF_18_ELEM
713 //{
714 // u32 num_static_patches;
715 // u32 num_map_patches;
716 //};
717 //
718 //
719 // struct PKTBI_BF_18
720 //{
721 // u32 num_maps;
722 // PKTBI_BF_18_ELEM elems[MAX_NUMER_REALMS];
723 //};
724 
725 // struct PKTBI_BF_19
726 //{
727 // u8 type; //always 2?
728 // u32 serial;
729 // u8 unk; //always 0?
730 // u8 lockbits; //Bits: XXSS DDII (s=strength, d=dex, i=int), 0 = up, 1 = down, 2 = locked
731 // enum
732 // {
733 // STR_MASK = 0x30,
734 // DEX_MASK = 0x0C,
735 // INT_MASK = 0x03
736 // };
737 // enum { MODE_UP, MODE_DOWN, MODE_LOCKED };
738 //};
739 
741 {
744  enum
745  {
748  STAT_INT
749  };
750  enum
751  {
754  MODE_LOCKED
755  };
756 };
757 
758 // struct PKTBI_BF_1B
759 //{
760 // u16 unk; //always 1
761 // u32 book_serial;
762 // u16 graphic;
763 // u16 scroll_offset;
764 // u8 content[8];// first bit of first byte = spell #1, second bit of first byte = spell #2, first
765 // bit of second byte = spell #8, etc
766 //
767 // enum { SCROLL_OFFSET_REGULAR = 1,
768 // SCROLL_OFFSET_NECRO = 101,
769 // SCROLL_OFFSET_PALADIN = 201 };
770 //};
771 
773 {
774  u16 unk2; // 00 02
775  u16 selected_spell; // absolute spell number. 1-64, 101-etc
776 };
777 
778 // struct PKTBI_BF_1D
779 //{
780 // u32 house_serial;
781 // u32 revision;
782 //};
783 
785 {
787 };
788 
789 // struct PKTBI_BF_20
790 //{
791 // u32 house_serial;
792 // u8 unk1; //0x4 for begin 0x5 for end
793 // u16 unk2; //0
794 // u32 unk3; //all FF
795 // u8 unk4; // FF
796 //};
797 
798 // displays damage amount over head
799 // struct PKTBI_BF_22
800 //{
801 // u8 unk; //always 1
802 // u32 serial;
803 // u8 damage_amt;
804 //};
805 
806 // no clue what this spam does.
808 {
810 };
811 
812 // struct PKTBI_BF_2A_CALL_RACE_CHANGER
813 //{
814 // u8 gender; // 0 = Male, 1 = Female
815 // u8 race; // 1 = Human, 2 = Elf
816 //};
817 
819 {
825 };
826 
827 // to change Hair, Beard and Color (maybe Race, but not in this Release)
829 {
830  union {
831  // PKTBI_BF_2A_CALL_RACE_CHANGER call;
833  };
834 };
835 
836 // Toggle gargoyle flying
838 {
839  u16 unk1; // always 0x0100 in my tests
840  u32 unk2; // always 0x0 in my tests
841 };
842 
843 struct PKTBI_BF
844 {
848  union {
849  u32 keys[6]; // BF.1: Cycling key-stack
850  u32 addkey; // BF.2: Adding key to top of stack
851  // PKTBI_BF_04 closegump; //BF.4
854  // u8 cursorhue; // BF.8: Cursor Hue (0=Felucca,1=Trammel)
855  char client_lang[3]; // BF.B Client language (client message, sent once at login)
856  u32 serial_closed_status_gump; // BF.C closed status gump
857  PKTBI_BF_0F clienttype; // BF.F clienttype (like char create/select)
862  // PKTBI_BF_16 closewindow; //BF.16
863  PKTBI_BF_17 codex; // BF.17
864  // PKTBI_BF_18 mapdiffs; //BF.18
865  // PKTBI_BF_19 extstatsout; //BF.19
867  // PKTBI_BF_1B newspellbook; //BF.1B
869  // PKTBI_BF_1D customhouseshort;
871  // PKTBI_BF_20 activatehousetool; //BF.20
872  // PKTBI_BF_22 damage; //BF.22
873  u8 se_spam; // BF.24
876  };
877 
878  enum
879  {
880  TYPE_CYCLE_STACK = 0x01,
881  TYPE_ADD_KEY = 0x02,
882  TYPE_CLOSE_GUMP = 0x04,
883  TYPE_SCREEN_SIZE = 0x05,
884  TYPE_PARTY_SYSTEM = 0x06,
885  TYPE_CURSOR_HUE = 0x08,
886  TYPE_WRESTLING_STUN = 0x0A,
887  TYPE_CLIENT_LANGUAGE = 0x0B,
888  TYPE_CLOSED_STATUS_GUMP = 0x0C,
889  TYPE_CLIENTTYPE = 0x0F,
890  TYPE_OBJECT_CACHE = 0x10,
891  TYPE_POPUP_MENU_REQUEST = 0x13,
892  TYPE_DISPLAY_POPUP_MENU = 0x14,
893  TYPE_POPUP_ENTRY_SELECT = 0x15,
894  TYPE_CLOSE_WINDOW = 0x16,
895  TYPE_CODEX_OF_WISDOM = 0x17,
896  TYPE_ENABLE_MAP_DIFFS = 0x18,
897  TYPE_EXTENDED_STATS_OUT = 0x19,
898  TYPE_EXTENDED_STATS_IN = 0x1A,
899  TYPE_NEW_SPELLBOOK = 0x1B,
900  TYPE_SPELL_SELECT = 0x1C,
901  TYPE_CUSTOM_HOUSE_SHORT = 0x1D,
902  TYPE_REQ_FULL_CUSTOM_HOUSE = 0x1E,
903  TYPE_ABILITY_ICON_CONFIRM = 0x21,
904  TYPE_ACTIVATE_CUSTOM_HOUSE_TOOL = 0x20,
905  TYPE_DAMAGE = 0x22,
906  TYPE_SESPAM = 0x24,
907  TYPE_CHARACTER_RACE_CHANGER = 0x2A,
908  TYPE_TOGGLE_FLYING = 0x32
909  };
910  enum
911  {
912  CURSORHUE_FELUCCA = 0,
913  CURSORHUE_TRAMMEL = 1
914  };
915 };
916 
917 struct PKTBI_C2
918 {
923  // When a server-sent message, these next 10+ bytes must all be 0x00.
924  u32 unk; // unknown -- always 0 0 0 1 (from client)
925  char lang[4]; // "enu" - US english
926  u16 wtext[2]; // wide-character, double-null terminated
927 
928  enum
929  {
930  SERVER_MSGLEN = 0x15
931  };
932 };
933 static_assert( sizeof( PKTBI_C2 ) == 23, "size missmatch" );
934 
935 struct PKTBI_C8
936 {
939 };
940 static_assert( sizeof( PKTBI_C8 ) == 2, "size missmatch" );
941 
942 struct PKTBI_D1
943 {
946 };
947 static_assert( sizeof( PKTBI_D1 ) == 2, "size missmatch" );
948 
950 {
953  struct
954  {
956  } serials[1];
957 };
958 static_assert( sizeof( PKTBI_D6_IN ) == 7, "size missmatch" );
959 
960 // struct AOS_OBJECT_PROPERTY_LIST_ELEM
961 //{
962 // u32 localization_num;
963 // u16 textlen;
964 // u16 text; //little endian Unicode text, not 0 terminated
965 //};
966 
967 /*
968 Big-Endian for u16/32 unless otherwise noted.
969 This is the AOS Version of the packet
970 */
971 // struct PKTBI_D6_OUT
972 //{
973 // u8 msgtype;
974 // u16 msglen;
975 // u16 unk1; //always 1
976 // u32 serial;
977 // u8 unk2; //always 0
978 // u8 unk3; //always 0
979 // u32 listid;
980 // AOS_OBJECT_PROPERTY_LIST_ELEM data[1];
981 //};
982 
983 // fixme: which 0 is z?
984 struct CH_ERASE
985 {
986  u8 unk1; // 0x00
987  u8 unk2; // 0x00
988  u8 unk3; // 0x00
990  u8 unk4; // 0x00
991  u32 xoffset; // from multi object center
992  u8 unk5; // 0x00
993  u32 yoffset; // from multi object center
994  u8 unk6; // 0x00
995  u32 z; // 0x00
996 };
997 
998 struct CH_ADD
999 {
1000  u8 unk1; // 0x00
1001  u8 unk2; // 0x00
1002  u8 unk3; // 0x00
1004  u8 unk4; // 0x00
1005  u32 xoffset; // from multi object center
1006  u8 unk5; // 0x00
1007  u32 yoffset; // from multi object center
1008 };
1009 
1011 {
1012  u8 unk1; // 0x00
1013  u8 unk2; // 0x00
1014  u8 unk3; // 0x00
1016  u8 unk4; // 0x00
1017  u32 xoffset; // from multi object center
1018  u8 unk5; // 0x00
1019  u32 yoffset; // from multi object center
1020 };
1021 
1023 {
1024  u32 unk1; // (0x00)
1026 };
1027 
1029 {
1030  u8 unk1; // 0x00
1031  u8 unk2; // 0x00
1032  u8 unk3; // 0x00
1034  u8 unk4; // 0x00
1035  u32 xoffset; // from multi object center
1036  u8 unk5; // 0x00
1037  u32 yoffset; // from multi object center
1040 };
1041 
1043 {
1044  u8 unk1; // 0x00
1045  u8 unk2; // 0x00
1046  u8 unk3; // 0x00
1048  u8 unk4; // 0x00
1049  u32 xoffset; // from multi object center
1050  u8 unk5; // 0x00
1051  u32 yoffset; // from multi object center
1054 };
1055 
1056 
1058 {
1059  u32 unk1; // (0x00)
1060  u8 ability; // 1 armor ignore, 2 bleed attack � 13 whirlwind attack
1061 };
1062 
1063 
1065 {
1070 };
1072 {
1076 };
1078 {
1080 };
1081 
1082 // must send msg A9 with flags | 0x20
1083 // Remember, with any housing change, you must increment the
1084 // House Revision number. Probably good to make a multi Revision
1085 // number for this, seperate from revision that Tooltips use. :x
1086 // Revision can be, in 0xD8, a u32.
1087 struct PKTBI_D7
1088 {
1093  union {
1101  };
1102  u8 unk; // Not always 07, no clue what this is for just yet.
1103  enum
1104  {
1105  CUSTOM_HOUSE_BACKUP = 0x02,
1106  CUSTOM_HOUSE_RESTORE = 0x03,
1107  CUSTOM_HOUSE_COMMIT = 0x04,
1108  CUSTOM_HOUSE_ERASE = 0x05,
1109  CUSTOM_HOUSE_ADD = 0x06,
1110  CUSTOM_HOUSE_QUIT = 0x0C,
1111  CUSTOM_HOUSE_ADD_MULTI = 0x0D,
1112  CUSTOM_HOUSE_SYNCH = 0x0E,
1113  CUSTOM_HOUSE_CLEAR = 0x10,
1114  CUSTOM_HOUSE_SELECT_FLOOR = 0x12,
1115  CUSTOM_HOUSE_SELECT_ROOF = 0x13, // SE Introduced?
1116  CUSTOM_HOUSE_DELETE_ROOF = 0x14, // SE Introduced?
1117  FIGHT_BOOK = 0x19,
1118  CUSTOM_HOUSE_REVERT = 0x1A,
1119  GUILD_BUTTON = 0x28,
1120  QUEST_BUTTON = 0x32
1121  };
1122 };
1123 
1124 #pragma pack( pop )
1125 }
1126 }
1127 #endif
unsigned char u8
Definition: rawtypes.h:25
PKTBI_BF_0F clienttype
Definition: pktboth.h:857
PKTBI_BF_06_01_IN partyadd
Definition: pktboth.h:616
u32 board_id
Definition: pktboth.h:353
CH_ADD_MULTI ch_add_multi
Definition: pktboth.h:1096
PKTBI_BF_05 screensize
Definition: pktboth.h:852
PKTBI_BF_06_02_IN partyremove
Definition: pktboth.h:618
PKTBI_BF_15 popupselect
Definition: pktboth.h:861
CH_ERASE ch_erase
Definition: pktboth.h:1094
PKTBI_BF_1C spellselect
Definition: pktboth.h:868
Definition: pktboth.h:360
PKTBI_BF_06_03 partymembermsg
Definition: pktboth.h:621
Definition: pktboth.h:364
PKTBI_BF_06_08 partyaccinvite
Definition: pktboth.h:626
PKTBI_BF_14 displaypopup
Definition: pktboth.h:860
u8 line_len
Definition: pktboth.h:366
u8 numlines
Definition: pktboth.h:362
u32 serial_closed_status_gump
Definition: pktboth.h:856
PKTBI_B8_IN_UPDATE profile_update
Definition: pktboth.h:478
u8 subj_len
Definition: pktboth.h:357
PKTBI_BF_RACE_CHANGER_RESULT characterracechanger
Definition: pktboth.h:874
u32 serial_request_popup_menu
Definition: pktboth.h:859
Definition: pktboth.h:355
CH_DELETE_ROOF ch_delete_roof
Definition: pktboth.h:1100
PKTBI_BF_1E reqfullcustomhouse
Definition: pktboth.h:870
PKTBI_BF_10 objectcache
Definition: pktboth.h:858
unsigned short u16
Definition: rawtypes.h:26
unsigned int u32
Definition: rawtypes.h:27
PKTBI_BF_06 partydata
Definition: pktboth.h:853
PKTBI_BF_06_04_IN partymsg
Definition: pktboth.h:622
PKTBI_BF_06_06 partylootperm
Definition: pktboth.h:624
FIGHT_BOOK_ABILITY fight_book_ability
Definition: pktboth.h:1098
PKTBI_BF_32 toggleflying
Definition: pktboth.h:875
CH_SELECT_FLOOR ch_select_floor
Definition: pktboth.h:1097
PKTBI_BF_1A extstatin
Definition: pktboth.h:866
signed char s8
Definition: rawtypes.h:29
PKTBI_BF_06_09 partydecinvite
Definition: pktboth.h:627
u32 target_cursor_serial
Definition: pktboth.h:209
CH_SELECT_ROOF ch_select_roof
Definition: pktboth.h:1099
std::string name
Definition: osmod.cpp:943
PKTBI_BF_17 codex
Definition: pktboth.h:863
Definition: pktboth.h:351
Definition: berror.cpp:12
u32 reply_id
Definition: pktboth.h:354
PKTBI_B8_IN_REQUEST profile_request
Definition: pktboth.h:477