diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp index 8cb821cca..8fc8ce370 100644 --- a/src/game/BattleGroundHandler.cpp +++ b/src/game/BattleGroundHandler.cpp @@ -269,13 +269,16 @@ void WorldSession::HandleBattleGroundPVPlogdataOpcode( WorldPacket & /*recv_data void WorldSession::HandleBattleGroundListOpcode( WorldPacket &recv_data ) { - CHECK_PACKET_SIZE(recv_data, 4); + CHECK_PACKET_SIZE(recv_data, 4 + 1); sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message"); uint32 bgTypeId; recv_data >> bgTypeId; // id from DBC + //uint8 unk; + //recv_data >> unk; // that byte is constant 0 in 3.1 + BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); if(!bl) { diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 7e7291181..141a306d5 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1788,6 +1788,7 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6 data->Initialize(SMSG_BATTLEFIELD_LIST); *data << uint64(guid); // battlemaster guid + *data << uint8(0); // unknown 3.1 *data << uint32(bgTypeId); // battleground id if(bgTypeId == BATTLEGROUND_AA) // arena { diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 939da111b..a63de107d 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -43,7 +43,7 @@ GameObject::GameObject() : WorldObject() m_objectType |= TYPEMASK_GAMEOBJECT; m_objectTypeId = TYPEID_GAMEOBJECT; // 3.1.0 - 0x348 - m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2); + m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2); m_valuesCount = GAMEOBJECT_END; m_respawnTime = 0; diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 486781b66..09d27557d 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -234,7 +234,7 @@ Item::Item( ) m_objectType |= TYPEMASK_ITEM; m_objectTypeId = TYPEID_ITEM; // 3.1.0 - 0x08 - m_updateFlag = UPDATEFLAG_LOWGUID; + m_updateFlag = UPDATEFLAG_HIGHGUID; m_valuesCount = ITEM_END; m_slot = 0; diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 7cd41ff47..ffcf9a97b 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -1249,4 +1249,6 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide }, }; diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index c36042815..980aa6882 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -1258,7 +1258,8 @@ enum Opcodes UMSG_UNKNOWN_1221 = 0x4C5, // not found UMSG_UNKNOWN_1222 = 0x4C6, // not found SMSG_UNKNOWN_1223 = 0x4C7, // arena pet? - NUM_MSG_TYPES = 0x4C8 + SMSG_UNKNOWN_1224 = 0x4C8, // uint32 + NUM_MSG_TYPES = 0x4C9 }; /// Player state diff --git a/src/game/Player.cpp b/src/game/Player.cpp index dffbf5825..5dd08d383 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -19962,33 +19962,44 @@ void Player::SendTalentsInfoData(bool pet) void Player::BuildEnchantmentsInfoData(WorldPacket *data) { uint32 slotUsedMask = 0; - *data << uint32(slotUsedMask); // > 0x80000 + size_t slotUsedMaskPos = data->wpos(); + *data << uint32(slotUsedMask); // slotUsedMask < 0x80000 for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - if(slotUsedMask & 1) + Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, i); + + if(!item) + continue; + + slotUsedMask |= (1 << i); + + *data << uint32(item->GetEntry()); // item entry + + uint16 enchantmentMask = 0; + size_t enchantmentMaskPos = data->wpos(); + *data << uint16(enchantmentMask); // enchantmentMask < 0x1000 + + for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j) { - *data << uint32(0); // item entry - uint16 enchantmentMask = 0; - *data << uint16(enchantmentMask); // > 0x1000 + uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j)); - for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j) - { - if(enchantmentMask & 1) - { - *data << uint16(0); // enchantmentId? - } + if(!enchId) + continue; - enchantmentMask >>= 1; - } + enchantmentMask |= (1 << j); - *data << uint16(0); - *data << uint8(0); // PGUID! - *data << uint32(0); + *data << uint16(enchId); // enchantmentId? } - slotUsedMask >>= 1; + data->put(enchantmentMaskPos, enchantmentMask); + + *data << uint16(0); // ? + *data << uint8(0); // PGUID! + *data << uint32(0); // seed? } + + data->put(slotUsedMaskPos, slotUsedMask); } void Player::LearnTalent(uint32 talentId, uint32 talentRank) diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp index 59b696a3b..6b0795893 100644 --- a/src/game/Transports.cpp +++ b/src/game/Transports.cpp @@ -135,7 +135,7 @@ void MapManager::LoadTransports() Transport::Transport() : GameObject() { // 3.1.0 - 0x34A - m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK1 | UPDATEFLAG_UNK2); + m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_UNK2); } bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index c17505c6c..b32e7003c 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -75,7 +75,7 @@ Unit::Unit() m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; // 3.1.0 - 0x60 - m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION); + m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION); m_attackTimer[BASE_ATTACK] = 0; m_attackTimer[OFF_ATTACK] = 0; diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h index 54eb4e1b2..fbc39167b 100644 --- a/src/game/UpdateFields.h +++ b/src/game/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H -// Auto generated for version 0, 1, 0, 9626 +// Auto generated for version 0, 1, 0, 9658 enum EObjectFields { @@ -394,9 +394,9 @@ enum EGameObjectFields { OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC + GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: BYTES, Flags: DYNAMIC GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC diff --git a/src/game/World.cpp b/src/game/World.cpp index 0f3f1086f..63c757a4e 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -252,6 +252,12 @@ World::AddSession_ (WorldSession* s) packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account s->SendPacket (&packet); + // Create and send the Addon packet + //if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked)) + // SendPacket (SendAddonPacked); + + s->SendTutorialsData(); + UpdateMaxSessionCounters (); // Updates the population diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index bc95ab1b7..412dc08c4 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -187,7 +187,7 @@ int WorldSocket::SendPacket (const WorldPacket& pct) } ServerPktHeader header(pct.size()+2, pct.GetOpcode()); - //m_Crypt.EncryptSend ( header.header, header.getHeaderLength()); + m_Crypt.EncryptSend ( header.header, header.getHeaderLength()); if (m_OutBuffer->space () >= pct.size () + header.getHeaderLength() && msg_queue()->is_empty()) { @@ -480,7 +480,7 @@ int WorldSocket::handle_input_header (void) ACE_ASSERT (m_Header.length () == sizeof (ClientPktHeader)); - //m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader)); + m_Crypt.DecryptRecv ((ACE_UINT8*) m_Header.rd_ptr (), sizeof (ClientPktHeader)); ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ()); @@ -992,12 +992,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) sWorld.AddSession (m_Session); - // Create and send the Addon packet - if (sAddOnHandler.BuildAddonPacket (&recvPacket, &SendAddonPacked)) - SendPacket (SendAddonPacked); - - m_Session->SendTutorialsData(); - return 0; } diff --git a/src/realmd/AuthCodes.h b/src/realmd/AuthCodes.h index 4e08b13bf..92e9b9a12 100644 --- a/src/realmd/AuthCodes.h +++ b/src/realmd/AuthCodes.h @@ -66,8 +66,8 @@ enum LoginResult // we need to stick to 1 version or half of the stuff will work for someone // others will not and opposite -// will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9637... +// will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9658... -#define EXPECTED_MANGOS_CLIENT_BUILD {9637, 0} +#define EXPECTED_MANGOS_CLIENT_BUILD {9658, 0} #endif diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp index ae38dc1ba..ffbbd6e74 100644 --- a/src/shared/Auth/AuthCrypt.cpp +++ b/src/shared/Auth/AuthCrypt.cpp @@ -35,19 +35,26 @@ void AuthCrypt::Init(BigNumber *K) HmacHash recvHash(SEED_KEY_SIZE, (uint8*)recvSeed); recvHash.UpdateBigNumber(K); recvHash.Finalize(); - _recvCrypt.Init(SHA_DIGEST_LENGTH, recvHash.GetDigest()); uint8 sendSeed[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 }; HmacHash sendHash(SEED_KEY_SIZE, (uint8*)sendSeed); sendHash.UpdateBigNumber(K); sendHash.Finalize(); - _sendCrypt.Init(SHA_DIGEST_LENGTH, sendHash.GetDigest()); - uint8 emptyBuf[1000]; - memset(emptyBuf, 0, 1000); + _recvCrypt.Init(recvHash.GetDigest(), sendHash.GetDigest()); + _sendCrypt.Init(recvHash.GetDigest(), sendHash.GetDigest()); - _sendCrypt.Process(1000, (uint8*)emptyBuf, (uint8*)emptyBuf); - _recvCrypt.Process(1000, (uint8*)emptyBuf, (uint8*)emptyBuf); + uint8 emptyBuf1[1024]; + memset(emptyBuf1, 0, 1024); + + _sendCrypt.Encrypt(1024, (uint8*)emptyBuf1); + _sendCrypt.Decrypt(1024, (uint8*)emptyBuf1); + + uint8 emptyBuf2[1024]; + memset(emptyBuf2, 0, 1024); + + _recvCrypt.Encrypt(1024, (uint8*)emptyBuf2); + _recvCrypt.Decrypt(1024, (uint8*)emptyBuf2); _initialized = true; } @@ -57,7 +64,7 @@ void AuthCrypt::DecryptRecv(uint8 *data, size_t len) if (!_initialized) return; - _recvCrypt.Process(len, data, data); + _recvCrypt.Decrypt(len, data); } void AuthCrypt::EncryptSend(uint8 *data, size_t len) @@ -65,5 +72,5 @@ void AuthCrypt::EncryptSend(uint8 *data, size_t len) if (!_initialized) return; - _sendCrypt.Process(len, data, data); + _sendCrypt.Encrypt(len, data); } diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h index 4ad71694a..c6bad1511 100644 --- a/src/shared/Auth/AuthCrypt.h +++ b/src/shared/Auth/AuthCrypt.h @@ -20,7 +20,6 @@ #define _AUTHCRYPT_H #include -#include #include "SARC4.h" class BigNumber; @@ -38,8 +37,8 @@ class AuthCrypt bool IsInitialized() { return _initialized; } private: - SARC4 _sendCrypt; SARC4 _recvCrypt; + SARC4 _sendCrypt; bool _initialized; }; #endif diff --git a/src/shared/Auth/Hmac.cpp b/src/shared/Auth/Hmac.cpp index 380907448..fb60279c6 100644 --- a/src/shared/Auth/Hmac.cpp +++ b/src/shared/Auth/Hmac.cpp @@ -23,14 +23,12 @@ HmacHash::HmacHash(uint32 len, uint8 *seed) { ASSERT(len == SEED_KEY_SIZE); - memcpy(&m_key, seed, len); HMAC_CTX_init(&m_ctx); - HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL); + HMAC_Init_ex(&m_ctx, seed, SEED_KEY_SIZE, EVP_sha1(), NULL); } HmacHash::~HmacHash() { - memset(&m_key, 0x00, SEED_KEY_SIZE); HMAC_CTX_cleanup(&m_ctx); } @@ -44,11 +42,6 @@ void HmacHash::UpdateData(const uint8 *data, int length) HMAC_Update(&m_ctx, data, length); } -void HmacHash::Initialize() -{ - HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL); -} - void HmacHash::Finalize() { uint32 length = 0; diff --git a/src/shared/Auth/Hmac.h b/src/shared/Auth/Hmac.h index 0b4058335..99ed0dd55 100644 --- a/src/shared/Auth/Hmac.h +++ b/src/shared/Auth/Hmac.h @@ -34,13 +34,11 @@ class HmacHash ~HmacHash(); void UpdateBigNumber(BigNumber *bn); void UpdateData(const uint8 *data, int length); - void Initialize(); void Finalize(); uint8 *GetDigest() { return m_digest; }; int GetLength() { return SHA_DIGEST_LENGTH; }; private: HMAC_CTX m_ctx; - uint8 m_key[SEED_KEY_SIZE]; uint8 m_digest[SHA_DIGEST_LENGTH]; }; #endif diff --git a/src/shared/Auth/SARC4.cpp b/src/shared/Auth/SARC4.cpp index 7b0bf21c4..fdbafcb63 100644 --- a/src/shared/Auth/SARC4.cpp +++ b/src/shared/Auth/SARC4.cpp @@ -17,14 +17,40 @@ */ #include "Auth/SARC4.h" -#include "BigNumber.h" +#include -void SARC4::Init(uint32 len, uint8 *seed) +SARC4::SARC4() { - RC4_set_key(&m_rc4_key, len, seed); + EVP_CIPHER_CTX_init(&m_encryptctx); + EVP_EncryptInit_ex(&m_encryptctx, EVP_rc4(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(&m_encryptctx, SHA_DIGEST_LENGTH); + EVP_CIPHER_CTX_init(&m_decryptctx); + EVP_DecryptInit_ex(&m_decryptctx, EVP_rc4(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(&m_decryptctx, SHA_DIGEST_LENGTH); } -void SARC4::Process(uint32 len, uint8 *indata, uint8 *outdata) +SARC4::~SARC4() { - RC4(&m_rc4_key, len, indata, outdata); + EVP_CIPHER_CTX_cleanup(&m_encryptctx); + EVP_CIPHER_CTX_cleanup(&m_decryptctx); +} + +void SARC4::Init(uint8 *seed1, uint8 *seed2) +{ + EVP_EncryptInit_ex(&m_encryptctx, NULL, NULL, seed1, NULL); + EVP_DecryptInit_ex(&m_decryptctx, NULL, NULL, seed2, NULL); +} + +void SARC4::Encrypt(uint32 len, uint8 *data) +{ + int outlen = 0; + EVP_EncryptUpdate(&m_encryptctx, data, &outlen, data, len); + EVP_EncryptFinal_ex(&m_encryptctx, data, &outlen); +} + +void SARC4::Decrypt(uint32 len, uint8 *data) +{ + int outlen = 0; + EVP_DecryptUpdate(&m_decryptctx, data, &outlen, data, len); + EVP_DecryptFinal_ex(&m_decryptctx, data, &outlen); } diff --git a/src/shared/Auth/SARC4.h b/src/shared/Auth/SARC4.h index 2a8c6403e..242fe0ba8 100644 --- a/src/shared/Auth/SARC4.h +++ b/src/shared/Auth/SARC4.h @@ -20,19 +20,18 @@ #define _AUTH_SARC4_H #include "Common.h" -#include -#include - -class BigNumber; - -#define SEED_KEY_SIZE 16 +#include class SARC4 { public: - void Init(uint32 len, uint8 *seed); - void Process(uint32 len, uint8 *indata, uint8 *outdata); + SARC4(); + ~SARC4(); + void Init(uint8 *seed1, uint8 *seed2); + void Encrypt(uint32 len, uint8 *data); + void Decrypt(uint32 len, uint8 *data); private: - RC4_KEY m_rc4_key; + EVP_CIPHER_CTX m_encryptctx; + EVP_CIPHER_CTX m_decryptctx; }; #endif