diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2017-05-13 17:25:21 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-05-13 17:25:21 +0200 |
commit | 229c78b5a38dc58e14f4912de49437b68341452b (patch) | |
tree | c7091cb6eb5044865cb35659646df9bf0e691009 /src | |
parent | bd456342e2e2e63264c1884e417b2779c9dab019 (diff) |
Core/Packets: Implemented CMSG_QUERY_REALM_NAME and SMSG_REALM_QUERY_RESPONSE
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/AuthHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.h | 37 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PartyPackets.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 23 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 8 | ||||
-rw-r--r-- | src/server/shared/Realm/Realm.cpp | 7 | ||||
-rw-r--r-- | src/server/shared/Realm/Realm.h | 3 | ||||
-rw-r--r-- | src/server/shared/Realm/RealmList.cpp | 3 | ||||
-rw-r--r-- | src/server/worldserver/Main.cpp | 1 |
16 files changed, 142 insertions, 40 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index d081a1d0ed9..da458834b51 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -9635,6 +9635,19 @@ std::string ObjectMgr::GetNormalizedRealmName(uint32 realmId) const return name; } +bool ObjectMgr::GetRealmName(uint32 realmId, std::string& name, std::string& normalizedName) const +{ + RealmNameContainer::const_iterator itr = _realmNameStore.find(realmId); + if (itr != _realmNameStore.end()) + { + name = itr->second; + normalizedName = itr->second; + normalizedName.erase(std::remove_if(normalizedName.begin(), normalizedName.end(), ::isspace), normalizedName.end()); + return true; + } + return false; +} + void ObjectMgr::LoadGameObjectQuestItems() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 5828bd65016..8bd95bf5e82 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1396,6 +1396,7 @@ class TC_GAME_API ObjectMgr std::string GetRealmName(uint32 realm) const; std::string GetNormalizedRealmName(uint32 realm) const; + bool GetRealmName(uint32 realmId, std::string& name, std::string& normalizedName) const; ExpansionRequirementContainer const& GetRaceExpansionRequirements() const { return _raceExpansionRequirementStore; } uint8 GetRaceExpansionRequirement(uint8 race) const diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp index 342982bbe00..016c324b232 100644 --- a/src/server/game/Handlers/AuthHandler.cpp +++ b/src/server/game/Handlers/AuthHandler.cpp @@ -34,12 +34,11 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos) response.SuccessInfo->AccountExpansionLevel = GetExpansion(); response.SuccessInfo->ActiveExpansionLevel = GetExpansion(); - response.SuccessInfo->VirtualRealmAddress = GetVirtualRealmAddress(); + response.SuccessInfo->VirtualRealmAddress = realm.Id.GetAddress(); response.SuccessInfo->Time = int32(time(nullptr)); // Send current home realm. Also there is no need to send it later in realm queries. - response.SuccessInfo->VirtualRealms.emplace_back(GetVirtualRealmAddress(), true, false, - sObjectMgr->GetRealmName(realm.Id.Realm), sObjectMgr->GetNormalizedRealmName(realm.Id.Realm)); + response.SuccessInfo->VirtualRealms.emplace_back(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName); if (HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES)) for (auto const& templ : sCharacterTemplateDataStore->GetCharacterTemplates()) diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 47803e0cfbc..0a9d1c60380 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -410,3 +410,19 @@ void WorldSession::HandleItemTextQuery(WorldPackets::Query::ItemTextQuery& itemT SendPacket(queryItemTextResponse.Write()); } + +void WorldSession::HandleQueryRealmName(WorldPackets::Query::QueryRealmName& queryRealmName) +{ + WorldPackets::Query::RealmQueryResponse realmQueryResponse; + realmQueryResponse.VirtualRealmAddress = queryRealmName.VirtualRealmAddress; + + Battlenet::RealmHandle realmHandle(queryRealmName.VirtualRealmAddress); + if (sObjectMgr->GetRealmName(realmHandle.Realm, realmQueryResponse.NameInfo.RealmNameActual, realmQueryResponse.NameInfo.RealmNameNormalized)) + { + realmQueryResponse.LookupState = RESPONSE_SUCCESS; + realmQueryResponse.NameInfo.IsInternalRealm = false; + realmQueryResponse.NameInfo.IsLocal = queryRealmName.VirtualRealmAddress == realm.Id.GetAddress(); + } + else + realmQueryResponse.LookupState = RESPONSE_FAILURE; +} diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 531dc81caa1..9ed123f4872 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -19,6 +19,28 @@ #include "CharacterTemplateDataStore.h" #include "HmacHash.h" +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmNameInfo const& virtualRealmInfo) +{ + data.WriteBit(virtualRealmInfo.IsLocal); + data.WriteBit(virtualRealmInfo.IsInternalRealm); + data.WriteBits(virtualRealmInfo.RealmNameActual.length(), 8); + data.WriteBits(virtualRealmInfo.RealmNameNormalized.length(), 8); + data.FlushBits(); + + data.WriteString(virtualRealmInfo.RealmNameActual); + data.WriteString(virtualRealmInfo.RealmNameNormalized); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmInfo const& virtualRealmInfo) +{ + data << uint32(virtualRealmInfo.RealmAddress); + data << virtualRealmInfo.RealmNameInfo; + + return data; +} + bool WorldPackets::Auth::EarlyProcessClientPacket::ReadNoThrow() { try @@ -144,18 +166,8 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() if (SuccessInfo->NumPlayersAlliance) _worldPacket << uint16(*SuccessInfo->NumPlayersAlliance); - for (auto const& virtualRealm : SuccessInfo->VirtualRealms) - { - _worldPacket << uint32(virtualRealm.RealmAddress); - _worldPacket.WriteBit(virtualRealm.IsLocal); - _worldPacket.WriteBit(virtualRealm.IsInternalRealm); - _worldPacket.WriteBits(virtualRealm.RealmNameActual.length(), 8); - _worldPacket.WriteBits(virtualRealm.RealmNameNormalized.length(), 8); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(virtualRealm.RealmNameActual); - _worldPacket.WriteString(virtualRealm.RealmNameNormalized); - } + for (VirtualRealmInfo const& virtualRealm : SuccessInfo->VirtualRealms) + _worldPacket << virtualRealm; for (CharacterTemplate const* templat : SuccessInfo->Templates) { diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 5c1bf9f6da6..2c7a17d217d 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -108,21 +108,30 @@ namespace WorldPackets bool HasFCM = false; ///< true if the account has a forced character migration pending. @todo implement }; + struct VirtualRealmNameInfo + { + VirtualRealmNameInfo() : IsLocal(false), IsInternalRealm(false) { } + VirtualRealmNameInfo(bool isHomeRealm, bool isInternalRealm, std::string const& realmNameActual, std::string const& realmNameNormalized) : + IsLocal(isHomeRealm), IsInternalRealm(isInternalRealm), RealmNameActual(realmNameActual), RealmNameNormalized(realmNameNormalized) { } + + bool IsLocal; ///< true if the realm is the same as the account's home realm + bool IsInternalRealm; ///< @todo research + std::string RealmNameActual; ///< the name of the realm + std::string RealmNameNormalized; ///< the name of the realm without spaces + }; + + struct VirtualRealmInfo + { + VirtualRealmInfo(uint32 realmAddress, bool isHomeRealm, bool isInternalRealm, std::string const& realmNameActual, std::string const& realmNameNormalized) : + RealmAddress(realmAddress), RealmNameInfo(isHomeRealm, isInternalRealm, realmNameActual, realmNameNormalized) { } + + uint32 RealmAddress; ///< the virtual address of this realm, constructed as RealmHandle::Region << 24 | RealmHandle::Battlegroup << 16 | RealmHandle::Index + VirtualRealmNameInfo RealmNameInfo; + }; + class AuthResponse final : public ServerPacket { public: - struct RealmInfo - { - RealmInfo(uint32 realmAddress, bool isHomeRealm, bool isInternalRealm, std::string const& realmNameActual, std::string const& realmNameNormalized) : - RealmAddress(realmAddress), IsLocal(isHomeRealm), IsInternalRealm(isInternalRealm), RealmNameActual(realmNameActual), RealmNameNormalized(realmNameNormalized) { } - - uint32 RealmAddress; ///< the virtual address of this realm, constructed as RealmHandle::Region << 24 | RealmHandle::Battlegroup << 16 | RealmHandle::Index - bool IsLocal; ///< true if the realm is the same as the account's home realm - bool IsInternalRealm; ///< @todo research - std::string RealmNameActual; ///< the name of the realm - std::string RealmNameNormalized; ///< the name of the realm without spaces - }; - struct AuthSuccessInfo { struct BillingInfo @@ -143,7 +152,7 @@ namespace WorldPackets BillingInfo Billing; - std::vector<RealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement + std::vector<VirtualRealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates. ExpansionRequirementContainer const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes @@ -283,4 +292,6 @@ namespace WorldPackets } } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmNameInfo const& realmInfo); + #endif // AuthenticationPacketsWorld_h__ diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 416014c1ced..6d5657d80b6 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -22,7 +22,6 @@ #include "Vehicle.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" -#include "ObjectMgr.h" WorldPacket const* WorldPackets::Party::PartyCommandResult::Write() { @@ -97,9 +96,9 @@ void WorldPackets::Party::PartyInvite::Initialize(Player* const inviter, int32 p ProposedRoles = proposedRoles; - InviterVirtualRealmAddress = GetVirtualRealmAddress(); - InviterRealmNameActual = sObjectMgr->GetRealmName(realm.Id.Realm); - InviterRealmNameNormalized = sObjectMgr->GetNormalizedRealmName(realm.Id.Realm); + InviterVirtualRealmAddress = realm.Id.GetAddress(); + InviterRealmNameActual = realm.Name; + InviterRealmNameNormalized = realm.NormalizedName; } void WorldPackets::Party::PartyInviteResponse::Read() diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 84cdb5e1e47..9fa813b005b 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -464,3 +464,18 @@ WorldPacket const* WorldPackets::Query::QueryItemTextResponse::Write() return &_worldPacket; } + +void WorldPackets::Query::QueryRealmName::Read() +{ + _worldPacket >> VirtualRealmAddress; +} + +WorldPacket const* WorldPackets::Query::RealmQueryResponse::Write() +{ + _worldPacket << uint32(VirtualRealmAddress); + _worldPacket << uint8(LookupState); + if (!LookupState) + _worldPacket << NameInfo; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index a5f95a9dc49..63fb21875c7 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -19,6 +19,7 @@ #define QueryPackets_h__ #include "Packet.h" +#include "AuthenticationPackets.h" #include "Creature.h" #include "NPCHandler.h" #include "G3D/Vector3.h" @@ -407,6 +408,28 @@ namespace WorldPackets bool Valid = false; ItemTextCache Item; }; + + class QueryRealmName final : public ClientPacket + { + public: + QueryRealmName(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_REALM_NAME, std::move(packet)) { } + + void Read() override; + + uint32 VirtualRealmAddress = 0; + }; + + class RealmQueryResponse final : public ServerPacket + { + public: + RealmQueryResponse() : ServerPacket(SMSG_REALM_QUERY_RESPONSE) { } + + WorldPacket const* Write() override; + + uint32 VirtualRealmAddress = 0; + uint8 LookupState = 0; + WorldPackets::Auth::VirtualRealmNameInfo NameInfo; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 103f3ebbd4d..5d8a6a7c14c 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -653,7 +653,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryQuestCompletionNPCs); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_QUEST_REWARDS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryRealmName); DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryScenarioPOI); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryTimeOpcode); DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleVoidStorageQuery); @@ -1611,7 +1611,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 3703cdcf513..8974bf2a369 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -558,6 +558,7 @@ namespace WorldPackets class QueryPetName; class QuestPOIQuery; class QueryQuestCompletionNPCs; + class QueryRealmName; class ItemTextQuery; } @@ -1747,6 +1748,8 @@ class TC_GAME_API WorldSession std::unordered_map<uint32, uint8> const& GetRealmCharacterCounts() const { return _realmCharacterCounts; } + void HandleQueryRealmName(WorldPackets::Query::QueryRealmName& queryRealmName); + // Artifact void HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPower& artifactAddPower); void HandleArtifactSetAppearance(WorldPackets::Artifact::ArtifactSetAppearance& artifactSetAppearance); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 08ea6e57195..5ced6e8bfab 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2188,8 +2188,7 @@ void World::SetInitialWorldSettings() TC_METRIC_EVENT("events", "World initialized", "World initialized in " + std::to_string(startupDuration / 60000) + " minutes " + std::to_string((startupDuration % 60000) / 1000) + " seconds"); - if (uint32 realmId = sConfigMgr->GetIntDefault("RealmID", 0)) // 0 reserved for auth - sLog->SetRealmId(realmId); + sLog->SetRealmId(realm.Id.Realm); } void World::ResetTimeDiffRecord() @@ -2220,9 +2219,8 @@ void World::LoadAutobroadcasts() m_Autobroadcasts.clear(); - uint32 realmId = sConfigMgr->GetIntDefault("RealmID", 0); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST); - stmt->setInt32(0, realmId); + stmt->setInt32(0, realm.Id.Realm); PreparedQueryResult result = LoginDatabase.Query(stmt); if (!result) @@ -3607,5 +3605,5 @@ Realm realm; uint32 GetVirtualRealmAddress() { - return uint32(realm.Id.Region) << 24 | uint32(realm.Id.Site) << 16 | realm.Id.Realm; + return realm.Id.GetAddress(); } diff --git a/src/server/shared/Realm/Realm.cpp b/src/server/shared/Realm/Realm.cpp index 45e5b445297..2754fa60581 100644 --- a/src/server/shared/Realm/Realm.cpp +++ b/src/server/shared/Realm/Realm.cpp @@ -19,6 +19,13 @@ #include "StringFormat.h" #include <boost/asio/ip/address.hpp> +void Realm::SetName(std::string name) +{ + Name = name; + NormalizedName = std::move(name); + NormalizedName.erase(std::remove_if(NormalizedName.begin(), NormalizedName.end(), ::isspace), NormalizedName.end()); +} + boost::asio::ip::address Realm::GetAddressForClient(boost::asio::ip::address const& clientAddr) const { boost::asio::ip::address realmIp; diff --git a/src/server/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h index 21675fe149b..bde0a47c7df 100644 --- a/src/server/shared/Realm/Realm.h +++ b/src/server/shared/Realm/Realm.h @@ -83,12 +83,15 @@ struct TC_SHARED_API Realm std::unique_ptr<boost::asio::ip::address> LocalSubnetMask; uint16 Port; std::string Name; + std::string NormalizedName; uint8 Type; RealmFlags Flags; uint8 Timezone; AccountTypes AllowedSecurityLevel; float PopulationLevel; + void SetName(std::string name); + boost::asio::ip::address GetAddressForClient(boost::asio::ip::address const& clientAddr) const; uint32 GetConfigId() const; diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp index 93bb4fc98ff..c579b741d8e 100644 --- a/src/server/shared/Realm/RealmList.cpp +++ b/src/server/shared/Realm/RealmList.cpp @@ -71,7 +71,8 @@ void RealmList::UpdateRealm(Battlenet::RealmHandle const& id, uint32 build, std: realm.Id = id; realm.Build = build; - realm.Name = name; + if (realm.Name != name) + realm.SetName(name); realm.Type = icon; realm.Flags = flag; realm.Timezone = timezone; diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 08cb7cd58c9..af1311f3b62 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -522,6 +522,7 @@ bool LoadRealmInfo() realm.LocalSubnetMask = Trinity::make_unique<boost::asio::ip::address>(*realmListRealm->LocalSubnetMask); realm.Port = realmListRealm->Port; realm.Name = realmListRealm->Name; + realm.NormalizedName = realmListRealm->NormalizedName; realm.Type = realmListRealm->Type; realm.Flags = realmListRealm->Flags; realm.Timezone = realmListRealm->Timezone; |