mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/PacketIO: Update opcodes to 7.3.2
This commit is contained in:
@@ -26,7 +26,7 @@ CREATE TABLE `account` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Identifier',
|
||||
`username` varchar(32) NOT NULL DEFAULT '',
|
||||
`sha_pass_hash` varchar(40) NOT NULL DEFAULT '',
|
||||
`sessionkey` varchar(80) NOT NULL DEFAULT '',
|
||||
`sessionkey` varchar(128) NOT NULL DEFAULT '',
|
||||
`v` varchar(64) NOT NULL DEFAULT '',
|
||||
`s` varchar(64) NOT NULL DEFAULT '',
|
||||
`token_key` varchar(100) NOT NULL DEFAULT '',
|
||||
|
||||
@@ -1620,6 +1620,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
||||
// send transfer packets
|
||||
WorldPackets::Movement::TransferPending transferPending;
|
||||
transferPending.MapID = mapid;
|
||||
transferPending.OldMapPosition = GetPosition();
|
||||
if (Transport* transport = GetTransport())
|
||||
{
|
||||
transferPending.Ship = boost::in_place();
|
||||
|
||||
@@ -110,9 +110,15 @@ void PlayerTaxi::LoadTaxiMask(std::string const &data)
|
||||
void PlayerTaxi::AppendTaximaskTo(WorldPackets::Taxi::ShowTaxiNodes& data, bool all)
|
||||
{
|
||||
if (all)
|
||||
data.Nodes = &sTaxiNodesMask; // all existed nodes
|
||||
{
|
||||
data.CanLandNodes = &sTaxiNodesMask; // all existed nodes
|
||||
data.CanUseNodes = &sTaxiNodesMask;
|
||||
}
|
||||
else
|
||||
data.Nodes = &m_taximask; // known nodes
|
||||
{
|
||||
data.CanLandNodes = &m_taximask; // known nodes
|
||||
data.CanUseNodes = &m_taximask;
|
||||
}
|
||||
}
|
||||
|
||||
bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint32 team)
|
||||
|
||||
@@ -54,15 +54,15 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery)
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::SendHotfixList(int32 version)
|
||||
void WorldSession::SendAvailableHotfixes(int32 version)
|
||||
{
|
||||
SendPacket(WorldPackets::Hotfix::HotfixList(version, sDB2Manager.GetHotfixData()).Write());
|
||||
SendPacket(WorldPackets::Hotfix::AvailableHotfixes(version, sDB2Manager.GetHotfixData()).Write());
|
||||
}
|
||||
|
||||
void WorldSession::HandleHotfixQuery(WorldPackets::Hotfix::HotfixQuery& hotfixQuery)
|
||||
void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotfixQuery)
|
||||
{
|
||||
std::map<uint64, int32> const& hotfixes = sDB2Manager.GetHotfixData();
|
||||
WorldPackets::Hotfix::HotfixQueryResponse hotfixQueryResponse;
|
||||
WorldPackets::Hotfix::HotfixResponse hotfixQueryResponse;
|
||||
hotfixQueryResponse.Hotfixes.reserve(hotfixQuery.Hotfixes.size());
|
||||
for (uint64 hotfixId : hotfixQuery.Hotfixes)
|
||||
{
|
||||
@@ -70,7 +70,7 @@ void WorldSession::HandleHotfixQuery(WorldPackets::Hotfix::HotfixQuery& hotfixQu
|
||||
{
|
||||
DB2StorageBase const* storage = sDB2Manager.GetStorage(PAIR64_HIPART(hotfixId));
|
||||
|
||||
WorldPackets::Hotfix::HotfixQueryResponse::HotfixData hotfixData;
|
||||
WorldPackets::Hotfix::HotfixResponse::HotfixData hotfixData;
|
||||
hotfixData.ID = hotfixId;
|
||||
hotfixData.RecordID = *hotfix;
|
||||
if (storage->HasRecord(hotfixData.RecordID))
|
||||
|
||||
@@ -53,11 +53,12 @@ void WorldSession::HandleAddToy(WorldPackets::Toy::AddToy& packet)
|
||||
|
||||
void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet)
|
||||
{
|
||||
ItemTemplate const* item = sObjectMgr->GetItemTemplate(packet.ItemID);
|
||||
uint32 itemId = packet.Cast.Misc[0];
|
||||
ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
|
||||
if (!item)
|
||||
return;
|
||||
|
||||
if (!_collectionMgr->HasToy(packet.ItemID))
|
||||
if (!_collectionMgr->HasToy(itemId))
|
||||
return;
|
||||
|
||||
auto effect = std::find_if(item->Effects.begin(), item->Effects.end(), [&packet](ItemEffectEntry const* effect)
|
||||
@@ -71,7 +72,7 @@ void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet)
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.Cast.SpellID);
|
||||
if (!spellInfo)
|
||||
{
|
||||
TC_LOG_ERROR("network", "HandleUseToy: unknown spell id: %u used by Toy Item entry %u", packet.Cast.SpellID, packet.ItemID);
|
||||
TC_LOG_ERROR("network", "HandleUseToy: unknown spell id: %u used by Toy Item entry %u", packet.Cast.SpellID, itemId);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -88,7 +89,7 @@ void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet)
|
||||
SendPacket(spellPrepare.Write());
|
||||
|
||||
spell->m_fromClient = true;
|
||||
spell->m_castItemEntry = packet.ItemID;
|
||||
spell->m_castItemEntry = itemId;
|
||||
spell->m_misc.Raw.Data[0] = packet.Cast.Misc[0];
|
||||
spell->m_misc.Raw.Data[1] = packet.Cast.Misc[1];
|
||||
spell->m_castFlagsEx |= CAST_FLAG_EX_USE_TOY_SPELL;
|
||||
|
||||
@@ -44,7 +44,7 @@ WorldPacket const* WorldPackets::Hotfix::DBReply::Write()
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Hotfix::HotfixList::Write()
|
||||
WorldPacket const* WorldPackets::Hotfix::AvailableHotfixes::Write()
|
||||
{
|
||||
_worldPacket << int32(HotfixCacheVersion);
|
||||
_worldPacket << uint32(Hotfixes.size());
|
||||
@@ -54,7 +54,7 @@ WorldPacket const* WorldPackets::Hotfix::HotfixList::Write()
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
void WorldPackets::Hotfix::HotfixQuery::Read()
|
||||
void WorldPackets::Hotfix::HotfixRequest::Read()
|
||||
{
|
||||
uint32 hotfixCount = _worldPacket.read<uint32>();
|
||||
if (hotfixCount > sDB2Manager.GetHotfixData().size())
|
||||
@@ -65,7 +65,7 @@ void WorldPackets::Hotfix::HotfixQuery::Read()
|
||||
_worldPacket >> hotfixId;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixQueryResponse::HotfixData const& hotfixData)
|
||||
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixResponse::HotfixData const& hotfixData)
|
||||
{
|
||||
data << uint64(hotfixData.ID);
|
||||
data << int32(hotfixData.RecordID);
|
||||
@@ -81,7 +81,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixQueryRespon
|
||||
return data;
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Hotfix::HotfixQueryResponse::Write()
|
||||
WorldPacket const* WorldPackets::Hotfix::HotfixResponse::Write()
|
||||
{
|
||||
_worldPacket << uint32(Hotfixes.size());
|
||||
for (HotfixData const& hotfix : Hotfixes)
|
||||
|
||||
@@ -59,11 +59,11 @@ namespace WorldPackets
|
||||
ByteBuffer Data;
|
||||
};
|
||||
|
||||
class HotfixList final : public ServerPacket
|
||||
class AvailableHotfixes final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HotfixList(int32 hotfixCacheVersion, std::map<uint64, int32> const& hotfixes)
|
||||
: ServerPacket(SMSG_HOTFIX_LIST), HotfixCacheVersion(hotfixCacheVersion), Hotfixes(hotfixes) { }
|
||||
AvailableHotfixes(int32 hotfixCacheVersion, std::map<uint64, int32> const& hotfixes)
|
||||
: ServerPacket(SMSG_AVAILABLE_HOTFIXES), HotfixCacheVersion(hotfixCacheVersion), Hotfixes(hotfixes) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
@@ -71,17 +71,17 @@ namespace WorldPackets
|
||||
std::map<uint64, int32> const& Hotfixes;
|
||||
};
|
||||
|
||||
class HotfixQuery final : public ClientPacket
|
||||
class HotfixRequest final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
HotfixQuery(WorldPacket&& packet) : ClientPacket(CMSG_HOTFIX_QUERY, std::move(packet)) { }
|
||||
HotfixRequest(WorldPacket&& packet) : ClientPacket(CMSG_HOTFIX_REQUEST, std::move(packet)) { }
|
||||
|
||||
void Read() override;
|
||||
|
||||
std::vector<uint64> Hotfixes;
|
||||
};
|
||||
|
||||
class HotfixQueryResponse final : public ServerPacket
|
||||
class HotfixResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
struct HotfixData
|
||||
@@ -91,7 +91,7 @@ namespace WorldPackets
|
||||
Optional<ByteBuffer> Data;
|
||||
};
|
||||
|
||||
HotfixQueryResponse() : ServerPacket(SMSG_HOTFIX_QUERY_RESPONSE) { }
|
||||
HotfixResponse() : ServerPacket(SMSG_HOTFIX_RESPONSE) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
|
||||
@@ -378,6 +378,7 @@ WorldPacket const* WorldPackets::LFG::LFGProposalUpdate::Write()
|
||||
_worldPacket << uint32(Slot);
|
||||
_worldPacket << int8(State);
|
||||
_worldPacket << uint32(CompletedMask);
|
||||
_worldPacket << uint32(EncounterMask);
|
||||
_worldPacket << uint32(Players.size());
|
||||
_worldPacket << uint8(Unused);
|
||||
_worldPacket.WriteBit(ValidCompletedMask);
|
||||
|
||||
@@ -395,6 +395,7 @@ namespace WorldPackets
|
||||
uint32 Slot = 0;
|
||||
int8 State = 0;
|
||||
uint32 CompletedMask = 0;
|
||||
uint32 EncounterMask = 0;
|
||||
uint8 Unused = 0;
|
||||
bool ValidCompletedMask = false;
|
||||
bool ProposalSilent = false;
|
||||
|
||||
@@ -199,6 +199,7 @@ namespace WorldPackets
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
int32 MapID = -1;
|
||||
TaggedPosition<Position::XYZ> OldMapPosition;
|
||||
Optional<ShipTransferPending> Ship;
|
||||
Optional<int32> TransferSpellID;
|
||||
};
|
||||
|
||||
@@ -372,7 +372,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con
|
||||
data << uint8(spellCastData.DestLocSpellCastIndex);
|
||||
data << spellCastData.Immunities;
|
||||
data << spellCastData.Predict;
|
||||
data.WriteBits(spellCastData.CastFlagsEx, 22);
|
||||
data.WriteBits(spellCastData.CastFlagsEx, 23);
|
||||
data.WriteBits(spellCastData.HitTargets.size(), 16);
|
||||
data.WriteBits(spellCastData.MissTargets.size(), 16);
|
||||
data.WriteBits(spellCastData.MissStatus.size(), 16);
|
||||
|
||||
@@ -35,6 +35,8 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
|
||||
_worldPacket << uint32(TokenRedeemIndex);
|
||||
_worldPacket << int64(TokenBalanceAmount);
|
||||
|
||||
_worldPacket << uint32(BpayStoreProductDeliveryDelay);
|
||||
|
||||
_worldPacket.WriteBit(VoiceEnabled);
|
||||
_worldPacket.WriteBit(EuropaTicketSystemStatus.is_initialized());
|
||||
_worldPacket.WriteBit(ScrollOfResurrectionEnabled);
|
||||
@@ -131,11 +133,15 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write()
|
||||
_worldPacket.WriteBit(false); // not accessed in handler
|
||||
_worldPacket.WriteBit(TrialBoostEnabled);
|
||||
_worldPacket.WriteBit(TokenBalanceEnabled);
|
||||
_worldPacket.WriteBit(LiveRegionCharacterListEnabled);
|
||||
_worldPacket.WriteBit(LiveRegionCharacterCopyEnabled);
|
||||
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
_worldPacket << int32(TokenPollTimeSeconds);
|
||||
_worldPacket << int32(TokenRedeemIndex);
|
||||
_worldPacket << int64(TokenBalanceAmount);
|
||||
_worldPacket << uint32(BpayStoreProductDeliveryDelay);
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace WorldPackets
|
||||
uint32 TokenPollTimeSeconds = 0;
|
||||
uint32 TokenRedeemIndex = 0;
|
||||
int64 TokenBalanceAmount = 0;
|
||||
uint32 BpayStoreProductDeliveryDelay = 0;
|
||||
bool ItemRestorationButtonEnabled = false;
|
||||
bool CharUndeleteEnabled = false; ///< Implemented
|
||||
bool BpayStoreDisabledByParentalControls = false;
|
||||
@@ -140,9 +141,13 @@ namespace WorldPackets
|
||||
bool CompetitiveModeEnabled = false; // NYI
|
||||
bool TrialBoostEnabled = false; // NYI
|
||||
bool TokenBalanceEnabled = false; // NYI
|
||||
bool LiveRegionCharacterListEnabled = false; // NYI
|
||||
bool LiveRegionCharacterCopyEnabled = false; // NYI
|
||||
bool LiveRegionAccountCopyEnabled = false; // NYI
|
||||
int32 TokenPollTimeSeconds = 0; // NYI
|
||||
int32 TokenRedeemIndex = 0; // NYI
|
||||
int64 TokenBalanceAmount = 0; // NYI
|
||||
uint32 BpayStoreProductDeliveryDelay = 0; // NYI
|
||||
};
|
||||
|
||||
class MOTD final : public ServerPacket
|
||||
|
||||
@@ -36,7 +36,8 @@ WorldPacket const* WorldPackets::Taxi::ShowTaxiNodes::Write()
|
||||
_worldPacket.WriteBit(WindowInfo.is_initialized());
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
_worldPacket << uint32(Nodes->size());
|
||||
_worldPacket << uint32(CanLandNodes->size());
|
||||
_worldPacket << uint32(CanUseNodes->size());
|
||||
|
||||
if (WindowInfo.is_initialized())
|
||||
{
|
||||
@@ -44,7 +45,8 @@ WorldPacket const* WorldPackets::Taxi::ShowTaxiNodes::Write()
|
||||
_worldPacket << uint32(WindowInfo->CurrentNode);
|
||||
}
|
||||
|
||||
_worldPacket.append(Nodes->data(), Nodes->size());
|
||||
_worldPacket.append(CanLandNodes->data(), CanLandNodes->size());
|
||||
_worldPacket.append(CanUseNodes->data(), CanUseNodes->size());
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
@@ -62,7 +62,8 @@ namespace WorldPackets
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
Optional<ShowTaxiNodesWindowInfo> WindowInfo;
|
||||
TaxiMask const* Nodes = nullptr;
|
||||
TaxiMask const* CanLandNodes = nullptr; // Nodes known by player
|
||||
TaxiMask const* CanUseNodes = nullptr; // Nodes available for use - this can temporarily disable a known node
|
||||
};
|
||||
|
||||
class EnableTaxiNode final : public ClientPacket
|
||||
|
||||
@@ -24,7 +24,6 @@ void WorldPackets::Toy::AddToy::Read()
|
||||
|
||||
void WorldPackets::Toy::UseToy::Read()
|
||||
{
|
||||
_worldPacket >> ItemID;
|
||||
_worldPacket >> Cast;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,6 @@ namespace WorldPackets
|
||||
void Read() override;
|
||||
|
||||
WorldPackets::Spells::SpellCastRequest Cast;
|
||||
uint32 ItemID = 0;
|
||||
};
|
||||
|
||||
class AccountToysUpdate final : public ServerPacket
|
||||
|
||||
@@ -161,6 +161,9 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode);
|
||||
DEFINE_HANDLER(CMSG_AREA_TRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaTriggerOpcode);
|
||||
DEFINE_HANDLER(CMSG_ARTIFACT_ADD_POWER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactAddPower);
|
||||
DEFINE_HANDLER(CMSG_ARTIFACT_ADD_RELIC_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_ARTIFACT_ATTUNE_PREVIEW_RELIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_ARTIFACT_ATTUNE_SOCKETED_RELIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactSetAppearance);
|
||||
DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackStopOpcode);
|
||||
DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackSwingOpcode);
|
||||
@@ -461,7 +464,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateInfoText);
|
||||
DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateMotdText);
|
||||
DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect);
|
||||
DEFINE_HANDLER(CMSG_HOTFIX_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleHotfixQuery);
|
||||
DEFINE_HANDLER(CMSG_HOTFIX_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleHotfixRequest);
|
||||
DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode);
|
||||
DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateRolePoll);
|
||||
DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode);
|
||||
@@ -682,6 +685,9 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepairItemOpcode);
|
||||
DEFINE_HANDLER(CMSG_REPLACE_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequest);
|
||||
DEFINE_HANDLER(CMSG_REPORT_CLIENT_VARIABLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_REPORT_ENABLED_ADDONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK);
|
||||
DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData);
|
||||
DEFINE_HANDLER(CMSG_REQUEST_AREA_POI_UPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
@@ -718,9 +724,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResurrectResponse);
|
||||
DEFINE_HANDLER(CMSG_REVERT_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRideVehicleInteract);
|
||||
DEFINE_HANDLER(CMSG_SAVE_CLIENT_VARIABLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSaveCUFProfiles);
|
||||
DEFINE_HANDLER(CMSG_SAVE_ENABLED_ADDONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave);
|
||||
DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblem);
|
||||
DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleScenePlaybackCanceled);
|
||||
@@ -889,6 +893,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_KNOWLEDGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_RESPEC_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_TRAITS_REFUNDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -912,6 +917,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_HOTFIXES, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAN_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1090,7 +1096,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CUSTOM_LOAD_SCREEN, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAILY_QUESTS_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAMAGE_CALC_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1268,9 +1273,8 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SEND_RANK_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIXES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1055,7 +1055,7 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue
|
||||
SendSetTimeZoneInformation();
|
||||
SendFeatureSystemStatusGlueScreen();
|
||||
SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION));
|
||||
SendHotfixList(int32(sWorld->getIntConfig(CONFIG_HOTFIX_CACHE_VERSION)));
|
||||
SendAvailableHotfixes(int32(sWorld->getIntConfig(CONFIG_HOTFIX_CACHE_VERSION)));
|
||||
SendTutorialsData();
|
||||
|
||||
if (PreparedQueryResult characterCountsResult = holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_REALM_CHARACTER_COUNTS))
|
||||
|
||||
@@ -355,7 +355,7 @@ namespace WorldPackets
|
||||
namespace Hotfix
|
||||
{
|
||||
class DBQueryBulk;
|
||||
class HotfixQuery;
|
||||
class HotfixRequest;
|
||||
}
|
||||
|
||||
namespace Inspect
|
||||
@@ -911,7 +911,7 @@ class TC_GAME_API WorldSession
|
||||
|
||||
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos = 0);
|
||||
void SendClientCacheVersion(uint32 version);
|
||||
void SendHotfixList(int32 version);
|
||||
void SendAvailableHotfixes(int32 version);
|
||||
|
||||
void InitializeSession();
|
||||
void InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQueryHolder* holder);
|
||||
@@ -1221,7 +1221,7 @@ class TC_GAME_API WorldSession
|
||||
void HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObject& packet);
|
||||
|
||||
void HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery);
|
||||
void HandleHotfixQuery(WorldPackets::Hotfix::HotfixQuery& hotfixQuery);
|
||||
void HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotfixQuery);
|
||||
|
||||
void HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortResponse& packet);
|
||||
void HandleMoveWorldportAck(); // for server-side calls
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "ScriptMgr.h"
|
||||
#include "SessionKeyGeneration.h"
|
||||
#include "SHA256.h"
|
||||
#include "Util.h"
|
||||
#include "World.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "WorldSession.h"
|
||||
@@ -69,6 +70,10 @@ uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3
|
||||
uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B };
|
||||
uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F };
|
||||
|
||||
uint32 const ClientTypeSeed_Win[4] = { 0xC34F59FE, 0xFF9A7F5E, 0x8A9DD986, 0x97B24A36 };
|
||||
uint32 const ClientTypeSeed_Wn64[4] = { 0x4E625212, 0xFAD6CBD8, 0x5D3FD3C7, 0xF335A567 };
|
||||
uint32 const ClientTypeSeed_Mc64[4] = { 0x95EFC66, 0x266170B8, 0x3145F79, 0xD8C1C808 };
|
||||
|
||||
WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)),
|
||||
_type(CONNECTION_TYPE_REALM), _key(0), _OverSpeedPings(0),
|
||||
_worldSession(nullptr), _authed(false), _sendBufferSize(4096), _compressionStream(nullptr)
|
||||
@@ -595,7 +600,7 @@ struct AccountInfo
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
BigNumber SessionKey;
|
||||
std::array<uint8, 64> KeyData;
|
||||
uint8 Expansion;
|
||||
int64 MuteTime;
|
||||
uint32 Recruiter;
|
||||
@@ -617,7 +622,7 @@ struct AccountInfo
|
||||
// LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account r ON a.id = r.recruiter
|
||||
// WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1
|
||||
Game.Id = fields[0].GetUInt32();
|
||||
Game.SessionKey.SetHexStr(fields[1].GetCString());
|
||||
HexStrToByteArray(fields[1].GetString(), Game.KeyData.data());
|
||||
BattleNet.LastIP = fields[2].GetString();
|
||||
BattleNet.IsLockedToIP = fields[3].GetBool();
|
||||
BattleNet.LockCountry = fields[4].GetString();
|
||||
@@ -667,7 +672,18 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
|
||||
// For hook purposes, we get Remoteaddress at this point.
|
||||
std::string address = GetRemoteIpAddress().to_string();
|
||||
|
||||
HmacSha256 hmac(SHA256_DIGEST_LENGTH, account.Game.SessionKey.AsByteArray(SHA256_DIGEST_LENGTH).get());
|
||||
SHA256Hash digestKeyHash;
|
||||
digestKeyHash.UpdateData(account.Game.KeyData.data(), account.Game.KeyData.size());
|
||||
if (account.Game.OS == "Win")
|
||||
digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Win), 16);
|
||||
else if (account.Game.OS == "Wn64")
|
||||
digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Wn64), 16);
|
||||
else if (account.Game.OS == "Mc64")
|
||||
digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Mc64), 16);
|
||||
|
||||
digestKeyHash.Finalize();
|
||||
|
||||
HmacSha256 hmac(digestKeyHash.GetLength(), digestKeyHash.GetDigest());
|
||||
hmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size());
|
||||
hmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16);
|
||||
hmac.UpdateData(AuthCheckSeed, 16);
|
||||
@@ -681,7 +697,11 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
|
||||
return;
|
||||
}
|
||||
|
||||
HmacSha256 sessionKeyHmac(SHA256_DIGEST_LENGTH, account.Game.SessionKey.AsByteArray(SHA256_DIGEST_LENGTH).get());
|
||||
SHA256Hash keyData;
|
||||
keyData.UpdateData(account.Game.KeyData.data(), account.Game.KeyData.size());
|
||||
keyData.Finalize();
|
||||
|
||||
HmacSha256 sessionKeyHmac(keyData.GetLength(), keyData.GetDigest());
|
||||
sessionKeyHmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16);
|
||||
sessionKeyHmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size());
|
||||
sessionKeyHmac.UpdateData(SessionKeySeed, 16);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "Errors.h"
|
||||
#include "Log.h"
|
||||
#include "ProtobufJSON.h"
|
||||
#include "SHA256.h"
|
||||
#include "Util.h"
|
||||
#include "game_utilities_service.pb.h"
|
||||
#include "RealmList.pb.h"
|
||||
@@ -397,13 +396,12 @@ uint32 RealmList::JoinRealm(uint32 realmAddress, uint32 build, boost::asio::ip::
|
||||
BigNumber serverSecret;
|
||||
serverSecret.SetRand(8 * 32);
|
||||
|
||||
SHA256Hash wowSessionKey;
|
||||
wowSessionKey.UpdateData(clientSecret.data(), clientSecret.size());
|
||||
wowSessionKey.UpdateData(serverSecret.AsByteArray(32).get(), 32);
|
||||
wowSessionKey.Finalize();
|
||||
std::array<uint8, 64> keyData;
|
||||
memcpy(&keyData[0], clientSecret.data(), 32);
|
||||
memcpy(&keyData[32], serverSecret.AsByteArray(32).get(), 32);
|
||||
|
||||
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_GAME_ACCOUNT_LOGIN_INFO);
|
||||
stmt->setString(0, ByteArrayToHexStr(wowSessionKey.GetDigest(), wowSessionKey.GetLength(), true));
|
||||
stmt->setString(0, ByteArrayToHexStr(keyData.data(), keyData.size()));
|
||||
stmt->setString(1, clientAddress.to_string());
|
||||
stmt->setUInt8(2, locale);
|
||||
stmt->setString(3, os);
|
||||
|
||||
Reference in New Issue
Block a user