38{
40 uLongf AddonRealSize;
43
44
45 if (Source->
rpos() + 4 > Source->
size())
46 return false;
47
48 *Source >> TempValue;
49
50
51 if (!TempValue)
52 return false;
53
54 AddonRealSize = TempValue;
55
56 CurrentPosition = Source->
rpos();
57
58 AddOnPacked.
resize(AddonRealSize);
59
60 if (uncompress(
const_cast<uint8*
>(AddOnPacked.
contents()), &AddonRealSize,
const_cast<uint8*
>((*Source).contents() + CurrentPosition), (*Source).size() - CurrentPosition) == Z_OK)
61 {
63
65 AddOnPacked >> addonsCount;
66
67 for (
uint32 i = 0; i < addonsCount; ++i)
68 {
69 std::string addonName;
72
73
74 if (AddOnPacked.
rpos() + 1 > AddOnPacked.
size())
75 return false;
76
77 AddOnPacked >> addonName;
78
79
80 if (AddOnPacked.
rpos() + 1 + 4 + 4 > AddOnPacked.
size())
81 return false;
82
83 AddOnPacked >> enabled >> crc >> unk2;
84
85 LOG_DEBUG(
"network",
"ADDON: Name: {}, Enabled: 0x{:x}, CRC: 0x{:x}, Unknown2: 0x{:x}", addonName, enabled, crc, unk2);
86
87 uint8 state = (enabled ? 2 : 1);
88 *Target <<
uint8(state);
89
90 uint8 unk1 = (enabled ? 1 : 0);
91 *Target <<
uint8(unk1);
92 if (unk1)
93 {
94 uint8 unk = (crc != 0x4c1c776d);
95 *Target <<
uint8(unk);
96 if (unk)
97 {
98 unsigned char tdata[256] =
99 {
100 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54,
101 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75,
102 0xFF, 0x31, 0xFE, 0x2F, 0x64, 0x3F, 0x3D, 0x6D, 0x07, 0xD9, 0x44, 0x9B, 0x40, 0x85, 0x59, 0x34,
103 0x4E, 0x10, 0xE1, 0xE7, 0x43, 0x69, 0xEF, 0x7C, 0x16, 0xFC, 0xB4, 0xED, 0x1B, 0x95, 0x28, 0xA8,
104 0x23, 0x76, 0x51, 0x31, 0x57, 0x30, 0x2B, 0x79, 0x08, 0x50, 0x10, 0x1C, 0x4A, 0x1A, 0x2C, 0xC8,
105 0x8B, 0x8F, 0x05, 0x2D, 0x22, 0x3D, 0xDB, 0x5A, 0x24, 0x7A, 0x0F, 0x13, 0x50, 0x37, 0x8F, 0x5A,
106 0xCC, 0x9E, 0x04, 0x44, 0x0E, 0x87, 0x01, 0xD4, 0xA3, 0x15, 0x94, 0x16, 0x34, 0xC6, 0xC2, 0xC3,
107 0xFB, 0x49, 0xFE, 0xE1, 0xF9, 0xDA, 0x8C, 0x50, 0x3C, 0xBE, 0x2C, 0xBB, 0x57, 0xED, 0x46, 0xB9,
108 0xAD, 0x8B, 0xC6, 0xDF, 0x0E, 0xD6, 0x0F, 0xBE, 0x80, 0xB3, 0x8B, 0x1E, 0x77, 0xCF, 0xAD, 0x22,
109 0xCF, 0xB7, 0x4B, 0xCF, 0xFB, 0xF0, 0x6B, 0x11, 0x45, 0x2D, 0x7A, 0x81, 0x18, 0xF2, 0x92, 0x7E,
110 0x98, 0x56, 0x5D, 0x5E, 0x69, 0x72, 0x0A, 0x0D, 0x03, 0x0A, 0x85, 0xA2, 0x85, 0x9C, 0xCB, 0xFB,
111 0x56, 0x6E, 0x8F, 0x44, 0xBB, 0x8F, 0x02, 0x22, 0x68, 0x63, 0x97, 0xBC, 0x85, 0xBA, 0xA8, 0xF7,
112 0xB5, 0x40, 0x68, 0x3C, 0x77, 0x86, 0x6F, 0x4B, 0xD7, 0x88, 0xCA, 0x8A, 0xD7, 0xCE, 0x36, 0xF0,
113 0x45, 0x6E, 0xD5, 0x64, 0x79, 0x0F, 0x17, 0xFC, 0x64, 0xDD, 0x10, 0x6F, 0xF3, 0xF5, 0xE0, 0xA6,
114 0xC3, 0xFB, 0x1B, 0x8C, 0x29, 0xEF, 0x8E, 0xE5, 0x34, 0xCB, 0xD1, 0x2A, 0xCE, 0x79, 0xC3, 0x9A,
115 0x0D, 0x36, 0xEA, 0x01, 0xE0, 0xAA, 0x91, 0x20, 0x54, 0xF0, 0x72, 0xD8, 0x1E, 0xC7, 0x89, 0xD2
116 };
117 Target->
append(tdata,
sizeof(tdata));
118 }
119
121 }
122
123 uint8 unk3 = (enabled ? 0 : 1);
124 *Target <<
uint8(unk3);
125 if (unk3)
126 {
127
129 }
130 }
131
133 AddOnPacked >> unk4;
134
137
138 if (AddOnPacked.
rpos() != AddOnPacked.
size())
139 LOG_DEBUG(
"network",
"packet under read!");
140 }
141 else
142 {
143 LOG_ERROR(
"network",
"Addon packet uncompress error :(");
144 return false;
145 }
146 return true;
147}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
std::uint8_t uint8
Definition: Define.h:109
std::uint32_t uint32
Definition: Define.h:107
@ SMSG_ADDON_INFO
Definition: Opcodes.h:781
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:68
Definition: ByteBuffer.h:70
std::size_t size() const
Definition: ByteBuffer.h:444
void append(T value)
Definition: ByteBuffer.h:129
std::size_t rpos() const
Definition: ByteBuffer.h:317
void resize(std::size_t newsize)
Definition: ByteBuffer.h:447
uint8 * contents()
Definition: ByteBuffer.h:424