aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Addons/AddonMgr.cpp1
-rw-r--r--src/server/game/Addons/AddonMgr.h9
-rw-r--r--src/server/game/Handlers/AddonHandler.cpp135
-rw-r--r--src/server/game/Handlers/AddonHandler.h43
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp10
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp8
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.cpp89
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.h56
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp7
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h3
-rw-r--r--src/server/game/Server/WorldSession.cpp84
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/scripts/CMakeLists.txt1
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}
)