Core/PacketIO: Enabled SMSG_ADDON_INFO and SMSG_ACCOUNT_DATA_TIMES
This commit is contained in:
@@ -21,7 +21,6 @@
|
||||
#include "DBCStores.h"
|
||||
#include "Log.h"
|
||||
#include "Timer.h"
|
||||
#include <openssl/md5.h>
|
||||
|
||||
namespace AddonMgr
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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__
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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}
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user