diff options
-rw-r--r-- | src/server/game/Addons/AddonMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Addons/AddonMgr.h | 9 | ||||
-rw-r--r-- | src/server/game/Handlers/AddonHandler.cpp | 135 | ||||
-rw-r--r-- | src/server/game/Handlers/AddonHandler.h | 43 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ClientConfigPackets.cpp | 89 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ClientConfigPackets.h | 56 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 84 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 5 | ||||
-rw-r--r-- | src/server/scripts/CMakeLists.txt | 1 |
14 files changed, 175 insertions, 278 deletions
diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp index 802c649943f..28e28c3f2fe 100644 --- a/src/server/game/Addons/AddonMgr.cpp +++ b/src/server/game/Addons/AddonMgr.cpp @@ -21,7 +21,6 @@ #include "DBCStores.h" #include "Log.h" #include "Timer.h" -#include <openssl/md5.h> namespace AddonMgr { diff --git a/src/server/game/Addons/AddonMgr.h b/src/server/game/Addons/AddonMgr.h index 5b98a1f9be6..d086b394b10 100644 --- a/src/server/game/Addons/AddonMgr.h +++ b/src/server/game/Addons/AddonMgr.h @@ -22,17 +22,18 @@ #include "Define.h" #include <string> #include <list> +#include <openssl/md5.h> struct AddonInfo { AddonInfo(const std::string& name, uint8 enabled, uint32 crc, uint8 state, bool crcOrPubKey) - : Name(name), Enabled(enabled), CRC(crc), State(state), UsePublicKeyOrCRC(crcOrPubKey) + : Name(name), Enabled(enabled), CRC(crc), Status(state), UsePublicKeyOrCRC(crcOrPubKey) { } std::string Name; uint8 Enabled; uint32 CRC; - uint8 State; + uint8 Status; bool UsePublicKeyOrCRC; }; @@ -50,8 +51,8 @@ struct SavedAddon struct BannedAddon { uint32 Id; - uint8 NameMD5[16]; - uint8 VersionMD5[16]; + uint8 NameMD5[MD5_DIGEST_LENGTH]; + uint8 VersionMD5[MD5_DIGEST_LENGTH]; uint32 Timestamp; }; diff --git a/src/server/game/Handlers/AddonHandler.cpp b/src/server/game/Handlers/AddonHandler.cpp deleted file mode 100644 index 8a00ddc22f4..00000000000 --- a/src/server/game/Handlers/AddonHandler.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "zlib.h" -#include "AddonHandler.h" -#include "DatabaseEnv.h" -#include "Opcodes.h" -#include "Log.h" - -bool AddonHandler::BuildAddonPacket(WorldPacket* source, WorldPacket* target) -{ - ByteBuffer AddOnPacked; - uLongf AddonRealSize; - uint32 CurrentPosition; - uint32 TempValue; - - // broken addon packet, can't be received from real client - if (source->rpos() + 4 > source->size()) - return false; - - *source >> TempValue; // get real size of the packed structure - - // empty addon packet, nothing process, can't be received from real client - if (!TempValue) - return false; - - AddonRealSize = TempValue; // temp value because ZLIB only excepts uLongf - - CurrentPosition = source->rpos(); // get the position of the pointer in the structure - - AddOnPacked.resize(AddonRealSize); // resize target for zlib action - - if (uncompress(AddOnPacked.contents(), &AddonRealSize, source->contents() + CurrentPosition, source->size() - CurrentPosition) == Z_OK) - { - target->Initialize(SMSG_ADDON_INFO); - - uint32 addonsCount; - AddOnPacked >> addonsCount; // addons count? - - for (uint32 i = 0; i < addonsCount; ++i) - { - std::string addonName; - uint8 enabled; - uint32 crc, unk2; - - // check next addon data format correctness - if (AddOnPacked.rpos()+1 > AddOnPacked.size()) - return false; - - AddOnPacked >> addonName; - - // recheck next addon data format correctness - if (AddOnPacked.rpos()+1+4+4 > AddOnPacked.size()) - return false; - - AddOnPacked >> enabled >> crc >> unk2; - - TC_LOG_DEBUG("network", "ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk2); - - uint8 state = (enabled ? 2 : 1); - *target << uint8(state); - - uint8 unk1 = (enabled ? 1 : 0); - *target << uint8(unk1); - if (unk1) - { - uint8 unk = (crc != 0x4c1c776d); // If addon is Standard addon CRC - *target << uint8(unk); - if (unk) - { - unsigned char tdata[256] = - { - 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54, - 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75, - 0xFF, 0x31, 0xFE, 0x2F, 0x64, 0x3F, 0x3D, 0x6D, 0x07, 0xD9, 0x44, 0x9B, 0x40, 0x85, 0x59, 0x34, - 0x4E, 0x10, 0xE1, 0xE7, 0x43, 0x69, 0xEF, 0x7C, 0x16, 0xFC, 0xB4, 0xED, 0x1B, 0x95, 0x28, 0xA8, - 0x23, 0x76, 0x51, 0x31, 0x57, 0x30, 0x2B, 0x79, 0x08, 0x50, 0x10, 0x1C, 0x4A, 0x1A, 0x2C, 0xC8, - 0x8B, 0x8F, 0x05, 0x2D, 0x22, 0x3D, 0xDB, 0x5A, 0x24, 0x7A, 0x0F, 0x13, 0x50, 0x37, 0x8F, 0x5A, - 0xCC, 0x9E, 0x04, 0x44, 0x0E, 0x87, 0x01, 0xD4, 0xA3, 0x15, 0x94, 0x16, 0x34, 0xC6, 0xC2, 0xC3, - 0xFB, 0x49, 0xFE, 0xE1, 0xF9, 0xDA, 0x8C, 0x50, 0x3C, 0xBE, 0x2C, 0xBB, 0x57, 0xED, 0x46, 0xB9, - 0xAD, 0x8B, 0xC6, 0xDF, 0x0E, 0xD6, 0x0F, 0xBE, 0x80, 0xB3, 0x8B, 0x1E, 0x77, 0xCF, 0xAD, 0x22, - 0xCF, 0xB7, 0x4B, 0xCF, 0xFB, 0xF0, 0x6B, 0x11, 0x45, 0x2D, 0x7A, 0x81, 0x18, 0xF2, 0x92, 0x7E, - 0x98, 0x56, 0x5D, 0x5E, 0x69, 0x72, 0x0A, 0x0D, 0x03, 0x0A, 0x85, 0xA2, 0x85, 0x9C, 0xCB, 0xFB, - 0x56, 0x6E, 0x8F, 0x44, 0xBB, 0x8F, 0x02, 0x22, 0x68, 0x63, 0x97, 0xBC, 0x85, 0xBA, 0xA8, 0xF7, - 0xB5, 0x40, 0x68, 0x3C, 0x77, 0x86, 0x6F, 0x4B, 0xD7, 0x88, 0xCA, 0x8A, 0xD7, 0xCE, 0x36, 0xF0, - 0x45, 0x6E, 0xD5, 0x64, 0x79, 0x0F, 0x17, 0xFC, 0x64, 0xDD, 0x10, 0x6F, 0xF3, 0xF5, 0xE0, 0xA6, - 0xC3, 0xFB, 0x1B, 0x8C, 0x29, 0xEF, 0x8E, 0xE5, 0x34, 0xCB, 0xD1, 0x2A, 0xCE, 0x79, 0xC3, 0x9A, - 0x0D, 0x36, 0xEA, 0x01, 0xE0, 0xAA, 0x91, 0x20, 0x54, 0xF0, 0x72, 0xD8, 0x1E, 0xC7, 0x89, 0xD2 - }; - target->append(tdata, sizeof(tdata)); - } - - *target << uint32(0); - } - - uint8 unk3 = (enabled ? 0 : 1); - *target << uint8(unk3); - if (unk3) - { - // String, 256 (null terminated?) - *target << uint8(0); - } - } - - uint32 unk4; - AddOnPacked >> unk4; - - uint32 count = 0; - *target << uint32(count); - - if (AddOnPacked.rpos() != AddOnPacked.size()) - TC_LOG_DEBUG("network", "packet under read!"); - } - else - { - TC_LOG_ERROR("network", "Addon packet uncompress error :("); - return false; - } - return true; -} diff --git a/src/server/game/Handlers/AddonHandler.h b/src/server/game/Handlers/AddonHandler.h deleted file mode 100644 index c60f2942efd..00000000000 --- a/src/server/game/Handlers/AddonHandler.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ADDONHANDLER_H -#define __ADDONHANDLER_H - -#include "Common.h" -#include "Config.h" -#include "WorldPacket.h" - -class AddonHandler -{ - public: - static AddonHandler* instance() - { - static AddonHandler instance; - return &instance; - } - - bool BuildAddonPacket(WorldPacket* Source, WorldPacket* Target); - - private: - AddonHandler() { } - ~AddonHandler() { } -}; -#define sAddOnHandler AddonHandler::instance() -#endif - diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b6c4020634e..3a083bb0a03 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -23,6 +23,7 @@ #include "CalendarMgr.h" #include "CharacterPackets.h" #include "Chat.h" +#include "ClientConfigPackets.h" #include "Common.h" #include "DatabaseEnv.h" #include "Group.h" @@ -821,7 +822,14 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) // load player specific part before send times LoadAccountData(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA), PER_CHARACTER_CACHE_MASK); - SendAccountDataTimes(PER_CHARACTER_CACHE_MASK); + + WorldPackets::ClientConfig::AccountDataTimes accountDataTimes; + accountDataTimes.PlayerGuid = playerGuid; + accountDataTimes.ServerTime = uint32(sWorld->GetGameTime()); + for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) + accountDataTimes.AccountTimes[i] = uint32(GetAccountData(AccountDataType(i))->Time); + + SendPacket(accountDataTimes.Write()); bool featureBit4 = true; WorldPacket data(SMSG_FEATURE_SYSTEM_STATUS, 7); // checked in 4.2.2 diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index df1fa4fed24..788ebd693dd 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1763,14 +1763,6 @@ void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& /*recvData*/) SendPacket(&data); } -void WorldSession::HandleReadyForAccountDataTimes(WorldPacket& /*recvData*/) -{ - // empty opcode - TC_LOG_DEBUG("network", "WORLD: CMSG_READY_FOR_ACCOUNT_DATA_TIMES"); - - SendAccountDataTimes(GLOBAL_CACHE_MASK); -} - void WorldSession::SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<uint32> const& terrainswaps, std::set<uint32> const& worldMapAreaSwaps) { ObjectGuid guid = _player->GetGUID(); diff --git a/src/server/game/Server/Packets/ClientConfigPackets.cpp b/src/server/game/Server/Packets/ClientConfigPackets.cpp new file mode 100644 index 00000000000..a2807b1b755 --- /dev/null +++ b/src/server/game/Server/Packets/ClientConfigPackets.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ClientConfigPackets.h" + +uint8 const WorldPackets::ClientConfig::AddonInfo::PublicKey[256] = +{ + 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54, + 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75, + 0xFF, 0x31, 0xFE, 0x2F, 0x64, 0x3F, 0x3D, 0x6D, 0x07, 0xD9, 0x44, 0x9B, 0x40, 0x85, 0x59, 0x34, + 0x4E, 0x10, 0xE1, 0xE7, 0x43, 0x69, 0xEF, 0x7C, 0x16, 0xFC, 0xB4, 0xED, 0x1B, 0x95, 0x28, 0xA8, + 0x23, 0x76, 0x51, 0x31, 0x57, 0x30, 0x2B, 0x79, 0x08, 0x50, 0x10, 0x1C, 0x4A, 0x1A, 0x2C, 0xC8, + 0x8B, 0x8F, 0x05, 0x2D, 0x22, 0x3D, 0xDB, 0x5A, 0x24, 0x7A, 0x0F, 0x13, 0x50, 0x37, 0x8F, 0x5A, + 0xCC, 0x9E, 0x04, 0x44, 0x0E, 0x87, 0x01, 0xD4, 0xA3, 0x15, 0x94, 0x16, 0x34, 0xC6, 0xC2, 0xC3, + 0xFB, 0x49, 0xFE, 0xE1, 0xF9, 0xDA, 0x8C, 0x50, 0x3C, 0xBE, 0x2C, 0xBB, 0x57, 0xED, 0x46, 0xB9, + 0xAD, 0x8B, 0xC6, 0xDF, 0x0E, 0xD6, 0x0F, 0xBE, 0x80, 0xB3, 0x8B, 0x1E, 0x77, 0xCF, 0xAD, 0x22, + 0xCF, 0xB7, 0x4B, 0xCF, 0xFB, 0xF0, 0x6B, 0x11, 0x45, 0x2D, 0x7A, 0x81, 0x18, 0xF2, 0x92, 0x7E, + 0x98, 0x56, 0x5D, 0x5E, 0x69, 0x72, 0x0A, 0x0D, 0x03, 0x0A, 0x85, 0xA2, 0x85, 0x9C, 0xCB, 0xFB, + 0x56, 0x6E, 0x8F, 0x44, 0xBB, 0x8F, 0x02, 0x22, 0x68, 0x63, 0x97, 0xBC, 0x85, 0xBA, 0xA8, 0xF7, + 0xB5, 0x40, 0x68, 0x3C, 0x77, 0x86, 0x6F, 0x4B, 0xD7, 0x88, 0xCA, 0x8A, 0xD7, 0xCE, 0x36, 0xF0, + 0x45, 0x6E, 0xD5, 0x64, 0x79, 0x0F, 0x17, 0xFC, 0x64, 0xDD, 0x10, 0x6F, 0xF3, 0xF5, 0xE0, 0xA6, + 0xC3, 0xFB, 0x1B, 0x8C, 0x29, 0xEF, 0x8E, 0xE5, 0x34, 0xCB, 0xD1, 0x2A, 0xCE, 0x79, 0xC3, 0x9A, + 0x0D, 0x36, 0xEA, 0x01, 0xE0, 0xAA, 0x91, 0x20, 0x54, 0xF0, 0x72, 0xD8, 0x1E, 0xC7, 0x89, 0xD2 +}; + +WorldPacket const* WorldPackets::ClientConfig::AddonInfo::Write() +{ + _worldPacket << uint32(Addons ? Addons->size() : 0); + _worldPacket << uint32(BannedAddons ? BannedAddons->size() : 0); + + if (Addons) + { + for (::AddonInfo const& addon : *Addons) + { + bool KeyProvided = addon.UsePublicKeyOrCRC && addon.CRC != STANDARD_ADDON_CRC; + _worldPacket << uint8(addon.Status); + + _worldPacket.WriteBit(addon.Enabled); // InfoProvided + _worldPacket.WriteBit(KeyProvided); // KeyProvided + _worldPacket.WriteBit(0); // UrlProvided + + if (addon.Enabled) + { + _worldPacket << uint8(1); // KeyVersion + _worldPacket << uint32(0); // Revision + } + + if (KeyProvided) + _worldPacket.append(PublicKey, sizeof(PublicKey)); // KeyData + } + } + + if (BannedAddons) + { + for (BannedAddon const& addon : *BannedAddons) + { + _worldPacket << uint32(addon.Id); // Id + _worldPacket.append(addon.NameMD5, MD5_DIGEST_LENGTH); // NameMD5 - MD5 of addon .toc filename without extension + _worldPacket.append(addon.VersionMD5, MD5_DIGEST_LENGTH); // VersionMD5 - MD5 of version string declared in addon .toc file + _worldPacket << uint32(addon.Timestamp); // LastModified + _worldPacket << uint32(1); // Flags + } + } + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::ClientConfig::AccountDataTimes::Write() +{ + _worldPacket << PlayerGuid; + _worldPacket << uint32(ServerTime); + _worldPacket.append(AccountTimes, NUM_ACCOUNT_DATA_TYPES); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ClientConfigPackets.h b/src/server/game/Server/Packets/ClientConfigPackets.h new file mode 100644 index 00000000000..897ba6fae20 --- /dev/null +++ b/src/server/game/Server/Packets/ClientConfigPackets.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef ClientConfigPackets_h__ +#define ClientConfigPackets_h__ + +#include "Packet.h" +#include "AddonMgr.h" +#include "WorldSession.h" + +namespace WorldPackets +{ + namespace ClientConfig + { + class AddonInfo final : public ServerPacket + { + static uint8 const PublicKey[256]; + + public: + AddonInfo() : ServerPacket(SMSG_ADDON_INFO) { } + + WorldPacket const* Write() override; + + std::list<::AddonInfo> const* Addons = nullptr; + std::list<BannedAddon> const* BannedAddons = nullptr; + }; + + class AccountDataTimes final : public ServerPacket + { + public: + AccountDataTimes() : ServerPacket(SMSG_ACCOUNT_DATA_TIMES, 4 + 4 * NUM_ACCOUNT_DATA_TYPES) { } + + WorldPacket const* Write() override; + + ObjectGuid PlayerGuid; + uint32 ServerTime = 0; + uint32 AccountTimes[NUM_ACCOUNT_DATA_TYPES]; + }; + } +} + +#endif // ClientConfigPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 7d4cf5b8ec1..30d9b657a5f 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -488,7 +488,6 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_POI_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPOIQuery ); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestQueryOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_RANDOMIZE_CHAR_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_READY_FOR_ACCOUNT_DATA_TIMES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadyForAccountDataTimes ); DEFINE_OPCODE_HANDLER_OLD(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadItem ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_SPLIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_RECLAIM_CORPSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode ); @@ -673,14 +672,14 @@ void OpcodeTable::Initialize() #define DEFINE_SERVER_OPCODE_HANDLER(opcode, status) \ ValidateAndSetOpcode(opcode, #opcode, status) - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED); @@ -1237,7 +1236,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 7155bd7970b..6023f45adb0 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -454,7 +454,6 @@ enum OpcodeClient : uint32 CMSG_QUEST_POI_QUERY = 0x0BD9, CMSG_QUEST_QUERY = 0x09A6, CMSG_RANDOMIZE_CHAR_NAME = 0xBADD, - CMSG_READY_FOR_ACCOUNT_DATA_TIMES = 0xBADD, CMSG_READ_ITEM = 0xBADD, CMSG_REALM_SPLIT = 0xBADD, CMSG_RECLAIM_CORPSE = 0xBADD, @@ -465,7 +464,7 @@ enum OpcodeClient : uint32 CMSG_REPLACE_ACCOUNT_DATA = 0xBADD, CMSG_REPOP_REQUEST = 0xBADD, CMSG_REPORT_PVP_AFK = 0xBADD, - CMSG_REQUEST_ACCOUNT_DATA = 0xBADD, + CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD, CMSG_REQUEST_CEMETERY_LIST = 0xBADD, CMSG_REQUEST_HOTFIX = 0xBADD, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 850264fb70d..0164ad9a575 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -49,6 +49,7 @@ #include "WardenMac.h" #include "BattlenetServerManager.h" #include "CharacterPackets.h" +#include "ClientConfigPackets.h" namespace { @@ -781,23 +782,10 @@ void WorldSession::SetAccountData(AccountDataType type, time_t tm, std::string c CharacterDatabase.Execute(stmt); } - m_accountData[type].Time = tm; m_accountData[type].Data = data; } -void WorldSession::SendAccountDataTimes(uint32 mask) -{ - WorldPacket data(SMSG_ACCOUNT_DATA_TIMES, 4 + 1 + 4 + NUM_ACCOUNT_DATA_TYPES * 4); - data << uint32(time(NULL)); // Server time - data << uint8(1); - data << uint32(mask); // type mask - for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) - if (mask & (1 << i)) - data << uint32(GetAccountData(AccountDataType(i))->Time);// also unix time - SendPacket(&data); -} - void WorldSession::LoadTutorialsData() { memset(m_Tutorials, 0, sizeof(uint32) * MAX_ACCOUNT_TUTORIAL_VALUES); @@ -861,6 +849,8 @@ void WorldSession::ReadAddonsInfo(ByteBuffer& data) ByteBuffer addonInfo; addonInfo.resize(size); + m_addonsList.clear(); + if (uncompress(addonInfo.contents(), &uSize, data.contents() + pos, data.size() - pos) == Z_OK) { uint32 addonsCount; @@ -913,70 +903,10 @@ void WorldSession::ReadAddonsInfo(ByteBuffer& data) void WorldSession::SendAddonsInfo() { - uint8 addonPublicKey[256] = - { - 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54, - 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75, - 0xFF, 0x31, 0xFE, 0x2F, 0x64, 0x3F, 0x3D, 0x6D, 0x07, 0xD9, 0x44, 0x9B, 0x40, 0x85, 0x59, 0x34, - 0x4E, 0x10, 0xE1, 0xE7, 0x43, 0x69, 0xEF, 0x7C, 0x16, 0xFC, 0xB4, 0xED, 0x1B, 0x95, 0x28, 0xA8, - 0x23, 0x76, 0x51, 0x31, 0x57, 0x30, 0x2B, 0x79, 0x08, 0x50, 0x10, 0x1C, 0x4A, 0x1A, 0x2C, 0xC8, - 0x8B, 0x8F, 0x05, 0x2D, 0x22, 0x3D, 0xDB, 0x5A, 0x24, 0x7A, 0x0F, 0x13, 0x50, 0x37, 0x8F, 0x5A, - 0xCC, 0x9E, 0x04, 0x44, 0x0E, 0x87, 0x01, 0xD4, 0xA3, 0x15, 0x94, 0x16, 0x34, 0xC6, 0xC2, 0xC3, - 0xFB, 0x49, 0xFE, 0xE1, 0xF9, 0xDA, 0x8C, 0x50, 0x3C, 0xBE, 0x2C, 0xBB, 0x57, 0xED, 0x46, 0xB9, - 0xAD, 0x8B, 0xC6, 0xDF, 0x0E, 0xD6, 0x0F, 0xBE, 0x80, 0xB3, 0x8B, 0x1E, 0x77, 0xCF, 0xAD, 0x22, - 0xCF, 0xB7, 0x4B, 0xCF, 0xFB, 0xF0, 0x6B, 0x11, 0x45, 0x2D, 0x7A, 0x81, 0x18, 0xF2, 0x92, 0x7E, - 0x98, 0x56, 0x5D, 0x5E, 0x69, 0x72, 0x0A, 0x0D, 0x03, 0x0A, 0x85, 0xA2, 0x85, 0x9C, 0xCB, 0xFB, - 0x56, 0x6E, 0x8F, 0x44, 0xBB, 0x8F, 0x02, 0x22, 0x68, 0x63, 0x97, 0xBC, 0x85, 0xBA, 0xA8, 0xF7, - 0xB5, 0x40, 0x68, 0x3C, 0x77, 0x86, 0x6F, 0x4B, 0xD7, 0x88, 0xCA, 0x8A, 0xD7, 0xCE, 0x36, 0xF0, - 0x45, 0x6E, 0xD5, 0x64, 0x79, 0x0F, 0x17, 0xFC, 0x64, 0xDD, 0x10, 0x6F, 0xF3, 0xF5, 0xE0, 0xA6, - 0xC3, 0xFB, 0x1B, 0x8C, 0x29, 0xEF, 0x8E, 0xE5, 0x34, 0xCB, 0xD1, 0x2A, 0xCE, 0x79, 0xC3, 0x9A, - 0x0D, 0x36, 0xEA, 0x01, 0xE0, 0xAA, 0x91, 0x20, 0x54, 0xF0, 0x72, 0xD8, 0x1E, 0xC7, 0x89, 0xD2 - }; - - - WorldPacket data(SMSG_ADDON_INFO, 4); - AddonMgr::BannedAddonList const* bannedAddons = AddonMgr::GetBannedAddons(); - - data << uint32(m_addonsList.size()); - data << uint32(bannedAddons->size()); - - for (AddonsList::iterator itr = m_addonsList.begin(); itr != m_addonsList.end(); ++itr) - { - bool sendCRC = itr->UsePublicKeyOrCRC && itr->CRC != STANDARD_ADDON_CRC; - data << uint8(itr->State); - - data.WriteBit(itr->Enabled); - data.WriteBit(sendCRC); - data.WriteBit(0); // Has URL - - if (itr->Enabled) - { - data << uint8(itr->Enabled); - data << uint32(0); - } - - if (sendCRC) - { - TC_LOG_INFO("misc", "ADDON: CRC (0x%x) for addon %s is wrong (does not match expected 0x%x), sending pubkey", - itr->CRC, itr->Name.c_str(), STANDARD_ADDON_CRC); - - data.append(addonPublicKey, sizeof(addonPublicKey)); - } - } - - m_addonsList.clear(); - - for (AddonMgr::BannedAddonList::const_iterator itr = bannedAddons->begin(); itr != bannedAddons->end(); ++itr) - { - data << uint32(itr->Id); - data.append(itr->NameMD5, sizeof(itr->NameMD5)); - data.append(itr->VersionMD5, sizeof(itr->VersionMD5)); - data << uint32(itr->Timestamp); - data << uint32(1); // IsBanned - } - - - SendPacket(&data); + WorldPackets::ClientConfig::AddonInfo addonInfo; + addonInfo.Addons = &m_addonsList; + addonInfo.BannedAddons = AddonMgr::GetBannedAddons(); + SendPacket(addonInfo.Write()); } bool WorldSession::IsAddonRegistered(const std::string& prefix) const diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 17ded49011b..6bda4e2d162 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -328,7 +328,6 @@ class WorldSession // Account Data AccountData* GetAccountData(AccountDataType type) { return &m_accountData[type]; } void SetAccountData(AccountDataType type, time_t tm, std::string const& data); - void SendAccountDataTimes(uint32 mask); void LoadGlobalAccountData(); void LoadAccountData(PreparedQueryResult result, uint32 mask); @@ -999,7 +998,6 @@ class WorldSession void HandleEquipmentSetDelete(WorldPacket& recvData); void HandleEquipmentSetUse(WorldPacket& recvData); void HandleWorldStateUITimerUpdate(WorldPacket& recvData); - void HandleReadyForAccountDataTimes(WorldPacket& recvData); void HandleQueryQuestsCompleted(WorldPacket& recvData); void HandleQuestNPCQuery(WorldPacket& recvData); void HandleQuestPOIQuery(WorldPacket& recvData); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 875bf2bba19..f043fafc261 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -370,10 +370,13 @@ bool World::RemoveQueuedPlayer(WorldSession* sess) pop_sess->SetInQueue(false); pop_sess->ResetTimeOutTime(); pop_sess->SendAuthWaitQue(0); + + pop_sess->SendSetTimeZoneInformation(); + pop_sess->SendFeatureSystemStatusGlueScreen(); + pop_sess->SendAddonsInfo(); pop_sess->SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); - pop_sess->SendAccountDataTimes(GLOBAL_CACHE_MASK); pop_sess->SendTutorialsData(); m_QueuedPlayer.pop_front(); diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index eab6a36d02e..f1dc26918f1 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -144,6 +144,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/World ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders ${MYSQL_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} ) |