diff options
Diffstat (limited to 'src/server/game')
24 files changed, 135 insertions, 116 deletions
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 113e81153ba..2055bf437c6 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -22,11 +22,10 @@ #include "Log.h" #include "ObjectAccessor.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "ScriptMgr.h" #include "SRP6.h" #include "Util.h" -#include "World.h" #include "WorldSession.h" using AccountSRP6 = Trinity::Crypto::SRP::GruntSRP6; @@ -503,7 +502,7 @@ void AccountMgr::LoadRBAC() while (result->NextRow()); TC_LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading default permissions"); - result = LoginDatabase.PQuery("SELECT secId, permissionId FROM rbac_default_permissions WHERE (realmId = {} OR realmId = -1) ORDER BY secId ASC", realm.Id.Realm); + result = LoginDatabase.PQuery("SELECT secId, permissionId FROM rbac_default_permissions WHERE (realmId = {} OR realmId = -1) ORDER BY secId ASC", sRealmList->GetCurrentRealmId().Realm); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 default permission definitions. DB table `rbac_default_permissions` is empty."); diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 4f70a7986e0..97d43ac2140 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -1880,9 +1880,14 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; case ModifierTreeType::ClientVersionEqualOrLessThan: // 33 - if (reqValue < sRealmList->GetMinorMajorBugfixVersionForBuild(realm.Build)) + { + std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm(); + if (!currentRealm) + return false; + if (reqValue < sRealmList->GetMinorMajorBugfixVersionForBuild(currentRealm->Build)) return false; break; + } case ModifierTreeType::BattlePetTeamLevel: // 34 for (WorldPackets::BattlePet::BattlePetSlot const& slot : referencePlayer->GetSession()->GetBattlePetMgr()->GetSlots()) if (slot.Pet.Level < reqValue) diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp index f153f7d4138..d42a668b12f 100644 --- a/src/server/game/BattlePets/BattlePetMgr.cpp +++ b/src/server/game/BattlePets/BattlePetMgr.cpp @@ -27,7 +27,7 @@ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "Util.h" #include "World.h" #include "WorldSession.h" @@ -290,18 +290,19 @@ void BattlePetMgr::LoadFromDB(PreparedQueryResult pets, PreparedQueryResult slot pet.NameTimestamp = fields[10].GetInt64(); pet.PacketInfo.CreatureID = speciesEntry->CreatureID; - if (!fields[12].IsNull()) + if (!fields[13].IsNull()) { pet.DeclinedName = std::make_unique<DeclinedName>(); for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - pet.DeclinedName->name[i] = fields[12 + i].GetString(); + pet.DeclinedName->name[i] = fields[13 + i].GetString(); } if (!ownerGuid.IsEmpty()) { pet.PacketInfo.OwnerInfo.emplace(); pet.PacketInfo.OwnerInfo->Guid = ownerGuid; - pet.PacketInfo.OwnerInfo->PlayerVirtualRealm = pet.PacketInfo.OwnerInfo->PlayerNativeRealm = GetVirtualRealmAddress(); + if (std::shared_ptr<Realm const> ownerRealm = sRealmList->GetRealm(fields[12].GetInt32())) + pet.PacketInfo.OwnerInfo->PlayerVirtualRealm = pet.PacketInfo.OwnerInfo->PlayerNativeRealm = ownerRealm->Id.GetAddress(); } pet.SaveInfo = BATTLE_PET_UNCHANGED; @@ -353,7 +354,7 @@ void BattlePetMgr::SaveToDB(LoginDatabaseTransaction trans) if (itr->second.PacketInfo.OwnerInfo) { stmt->setInt64(12, itr->second.PacketInfo.OwnerInfo->Guid.GetCounter()); - stmt->setInt32(13, realm.Id.Realm); + stmt->setInt32(13, sRealmList->GetCurrentRealmId().Realm); } else { diff --git a/src/server/game/BlackMarket/BlackMarketMgr.cpp b/src/server/game/BlackMarket/BlackMarketMgr.cpp index 59ebe4555d3..7a782558180 100644 --- a/src/server/game/BlackMarket/BlackMarketMgr.cpp +++ b/src/server/game/BlackMarket/BlackMarketMgr.cpp @@ -29,7 +29,7 @@ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "StringConvert.h" #include "World.h" #include "WorldSession.h" @@ -285,7 +285,7 @@ void BlackMarketMgr::SendAuctionWonMail(BlackMarketEntry* entry, CharacterDataba if (!bidderAccId) // Account exists return; - logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm); + logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, sRealmList->GetCurrentRealmId().Realm); if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(bidderGuid, bidderName)) bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index 7b05b344f65..ea06221f36d 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -22,7 +22,7 @@ #include "DB2Stores.h" #include "Log.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "World.h" #include "WorldSession.h" @@ -286,9 +286,10 @@ ObjectGuid ChannelMgr::CreateBuiltinChannelGuid(uint32 channelId, AreaTableEntry zoneId = zoneEntry->ID; if (channelEntry->GetFlags().HasFlag(ChatChannelFlags::GlobalForTournament)) - if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(realm.Timezone)) - if (category->GetFlags().HasFlag(CfgCategoriesFlags::Tournament)) - zoneId = 0; + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(currentRealm->Timezone)) + if (category->GetFlags().HasFlag(CfgCategoriesFlags::Tournament)) + zoneId = 0; return ObjectGuid::Create<HighGuid::ChatChannel>(true, channelEntry->GetFlags().HasFlag(ChatChannelFlags::LinkedChannel), zoneId, _team == ALLIANCE ? 3 : 5, channelId); } diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 832d14631bc..4255cc1daad 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -29,7 +29,7 @@ #include "ObjectMgr.h" #include "Optional.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "StringConvert.h" #include "World.h" #include "WorldSession.h" @@ -95,7 +95,7 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac if (target) target_sec = target->GetSecurity(); else if (target_account) - target_sec = AccountMgr::GetSecurity(target_account, realm.Id.Realm); + target_sec = AccountMgr::GetSecurity(target_account, sRealmList->GetCurrentRealmId().Realm); else return true; // caller must report error for (target == nullptr && target_account == 0) diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 710bfec570c..357e0be46e4 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -43,7 +43,7 @@ #include "PhasingHandler.h" #include "Player.h" #include "RaceMask.h" -#include "Realm.h" +#include "RealmList.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "Spell.h" @@ -3328,7 +3328,7 @@ static int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const* // WSE_FUNCTION_REGION [](Map const* /*map*/, uint32 /*arg1*/, uint32 /*arg2*/) -> int32 { - return realm.Id.Region; + return sRealmList->GetCurrentRealmId().Region; }, // WSE_FUNCTION_CLOCK_HOUR @@ -3376,7 +3376,7 @@ static int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const* { time_t now = GameTime::GetGameTime(); uint32 raidOrigin = 1135695600; - if (Cfg_RegionsEntry const* region = sCfgRegionsStore.LookupEntry(realm.Id.Region)) + if (Cfg_RegionsEntry const* region = sCfgRegionsStore.LookupEntry(sRealmList->GetCurrentRealmId().Region)) raidOrigin = region->Raidorigin; return (now - raidOrigin) / WEEK; diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index 4b3c661ccaa..0c59aa0fe52 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -20,7 +20,7 @@ #include "Errors.h" #include "Hash.h" #include "Log.h" -#include "Realm.h" +#include "RealmList.h" #include "Util.h" #include "World.h" #include <charconv> @@ -815,7 +815,7 @@ static inline uint32 GetRealmIdForObjectGuid(uint32 realmId) if (realmId) return realmId; - return realm.Id.Realm; + return sRealmList->GetCurrentRealmId().Realm; } ObjectGuid ObjectGuidFactory::CreateNull() diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cb5dc78020b..e455efcfb74 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3913,12 +3913,12 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PET_DECLINED_NAME_BY_OWNER); loginStmt->setInt64(0, guid); - loginStmt->setInt32(1, realm.Id.Realm); + loginStmt->setInt32(1, sRealmList->GetCurrentRealmId().Realm); loginTransaction->Append(loginStmt); loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PETS_BY_OWNER); loginStmt->setInt64(0, guid); - loginStmt->setInt32(1, realm.Id.Realm); + loginStmt->setInt32(1, sRealmList->GetCurrentRealmId().Realm); loginTransaction->Append(loginStmt); Corpse::DeleteFromDB(playerguid, trans); @@ -19070,7 +19070,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setString(index++, ss.str()); stmt->setUInt8(index++, m_activePlayerData->MultiActionBars); - stmt->setUInt32(index++, sRealmList->GetMinorMajorBugfixVersionForBuild(realm.Build)); + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + stmt->setUInt32(index++, sRealmList->GetMinorMajorBugfixVersionForBuild(currentRealm->Build)); + else + stmt->setUInt32(index++, 0); } else { @@ -19213,7 +19216,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetHonorLevel()); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_HONOR].StateID); stmt->setFloat(index++, finiteAlways(_restMgr->GetRestBonus(REST_TYPE_HONOR))); - stmt->setUInt32(index++, sRealmList->GetMinorMajorBugfixVersionForBuild(realm.Build)); + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + stmt->setUInt32(index++, sRealmList->GetMinorMajorBugfixVersionForBuild(currentRealm->Build)); + else + stmt->setUInt32(index++, 0); // Index stmt->setUInt64(index, GetGUID().GetCounter()); @@ -19273,17 +19279,19 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba GetSession()->GetCollectionMgr()->SaveAccountItemAppearances(loginTransaction); GetSession()->GetCollectionMgr()->SaveAccountTransmogIllusions(loginTransaction); + Battlenet::RealmHandle currentRealmId = sRealmList->GetCurrentRealmId(); + LoginDatabasePreparedStatement* loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BNET_LAST_PLAYER_CHARACTERS); loginStmt->setUInt32(0, GetSession()->GetAccountId()); - loginStmt->setUInt8(1, realm.Id.Region); - loginStmt->setUInt8(2, realm.Id.Site); + loginStmt->setUInt8(1, currentRealmId.Region); + loginStmt->setUInt8(2, currentRealmId.Site); loginTransaction->Append(loginStmt); loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BNET_LAST_PLAYER_CHARACTERS); loginStmt->setUInt32(0, GetSession()->GetAccountId()); - loginStmt->setUInt8(1, realm.Id.Region); - loginStmt->setUInt8(2, realm.Id.Site); - loginStmt->setUInt32(3, realm.Id.Realm); + loginStmt->setUInt8(1, currentRealmId.Region); + loginStmt->setUInt8(2, currentRealmId.Site); + loginStmt->setUInt32(3, currentRealmId.Realm); loginStmt->setString(4, GetName()); loginStmt->setUInt64(5, GetGUID().GetCounter()); loginStmt->setUInt32(6, GameTime::GetGameTime()); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ed782815fd3..d13f4ace139 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -52,7 +52,7 @@ #include "QueryPackets.h" #include "QuestDef.h" #include "Random.h" -#include "Realm.h" +#include "RealmList.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "ScriptReloadMgr.h" @@ -8728,8 +8728,9 @@ bool ObjectMgr::IsReservedName(std::string_view name) const static EnumFlag<CfgCategoriesCharsets> GetRealmLanguageType(bool create) { - if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(realm.Timezone)) - return create ? category->GetCreateCharsetMask() : category->GetExistingCharsetMask(); + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + if (Cfg_CategoriesEntry const* category = sCfgCategoriesStore.LookupEntry(currentRealm->Timezone)) + return create ? category->GetCreateCharsetMask() : category->GetExistingCharsetMask(); return create ? CfgCategoriesCharsets::English : CfgCategoriesCharsets::Any; // basic-Latin at create, any at login } diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp index 13db0718450..7af2a1e46fa 100644 --- a/src/server/game/Handlers/AuthHandler.cpp +++ b/src/server/game/Handlers/AuthHandler.cpp @@ -24,7 +24,7 @@ #include "GameTime.h" #include "ObjectMgr.h" #include "RBAC.h" -#include "Realm.h" +#include "RealmList.h" #include "SystemPackets.h" #include "Timezone.h" #include "World.h" @@ -40,11 +40,14 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos) response.SuccessInfo->ActiveExpansionLevel = GetExpansion(); response.SuccessInfo->AccountExpansionLevel = GetAccountExpansion(); - response.SuccessInfo->VirtualRealmAddress = realm.Id.GetAddress(); response.SuccessInfo->Time = int32(GameTime::GetGameTime()); // Send current home realm. Also there is no need to send it later in realm queries. - response.SuccessInfo->VirtualRealms.emplace_back(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName); + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + { + response.SuccessInfo->VirtualRealmAddress = currentRealm->Id.GetAddress(); + response.SuccessInfo->VirtualRealms.emplace_back(currentRealm->Id.GetAddress(), true, false, currentRealm->Name, currentRealm->NormalizedName); + } if (HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES)) for (auto&& templ : sCharacterTemplateDataStore->GetCharacterTemplates()) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 55be2545110..17dcbefcc86 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -55,7 +55,7 @@ #include "PlayerDump.h" #include "QueryHolder.h" #include "QueryPackets.h" -#include "Realm.h" +#include "RealmList.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "SocialMgr.h" @@ -901,7 +901,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_REALM_CHARACTERS); stmt->setUInt32(0, createInfo->CharCount); stmt->setUInt32(1, GetAccountId()); - stmt->setUInt32(2, realm.Id.Realm); + stmt->setUInt32(2, sRealmList->GetCurrentRealmId().Realm); trans->Append(stmt); LoginDatabase.CommitTransaction(trans); diff --git a/src/server/game/Handlers/HotfixHandler.cpp b/src/server/game/Handlers/HotfixHandler.cpp index 54e70d3884e..82c741f40bc 100644 --- a/src/server/game/Handlers/HotfixHandler.cpp +++ b/src/server/game/Handlers/HotfixHandler.cpp @@ -61,7 +61,7 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery) void WorldSession::SendAvailableHotfixes() { WorldPackets::Hotfix::AvailableHotfixes availableHotfixes; - availableHotfixes.VirtualRealmAddress = realm.Id.GetAddress(); + availableHotfixes.VirtualRealmAddress = GetVirtualRealmAddress(); for (auto const& [pushId, push] : sDB2Manager.GetHotfixData()) { diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 4bcab4d2074..c848cc67c7d 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -321,12 +321,13 @@ void WorldSession::HandleQueryRealmName(WorldPackets::Query::QueryRealmName& que WorldPackets::Query::RealmQueryResponse realmQueryResponse; realmQueryResponse.VirtualRealmAddress = queryRealmName.VirtualRealmAddress; - Battlenet::RealmHandle realmHandle(queryRealmName.VirtualRealmAddress); - if (sRealmList->GetRealmNames(realmHandle, &realmQueryResponse.NameInfo.RealmNameActual, &realmQueryResponse.NameInfo.RealmNameNormalized)) + if (std::shared_ptr<Realm const> realm = sRealmList->GetRealm(queryRealmName.VirtualRealmAddress)) { realmQueryResponse.LookupState = RESPONSE_SUCCESS; realmQueryResponse.NameInfo.IsInternalRealm = false; realmQueryResponse.NameInfo.IsLocal = queryRealmName.VirtualRealmAddress == GetVirtualRealmAddress(); + realmQueryResponse.NameInfo.RealmNameActual = realm->Name; + realmQueryResponse.NameInfo.RealmNameNormalized = realm->NormalizedName; } else realmQueryResponse.LookupState = RESPONSE_FAILURE; diff --git a/src/server/game/Handlers/SocialHandler.cpp b/src/server/game/Handlers/SocialHandler.cpp index 02e381e2be6..16dc1421da4 100644 --- a/src/server/game/Handlers/SocialHandler.cpp +++ b/src/server/game/Handlers/SocialHandler.cpp @@ -25,10 +25,9 @@ #include "Player.h" #include "QueryCallback.h" #include "RBAC.h" -#include "Realm.h" +#include "RealmList.h" #include "SocialMgr.h" #include "SocialPackets.h" -#include "World.h" void WorldSession::HandleContactListOpcode(WorldPackets::Social::SendContactList& packet) { @@ -104,7 +103,7 @@ void WorldSession::HandleAddFriendOpcode(WorldPackets::Social::AddFriend& packet } // When not found, consult database - GetQueryProcessor().AddCallback(AccountMgr::GetSecurityAsync(friendCharacterInfo->AccountId, realm.Id.Realm, + GetQueryProcessor().AddCallback(AccountMgr::GetSecurityAsync(friendCharacterInfo->AccountId, sRealmList->GetCurrentRealmId().Realm, [this, continuation = std::move(processFriendRequest)](uint32 friendSecurity) { if (!AccountMgr::IsPlayerAccount(friendSecurity)) diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index fc8365dd507..2d9ffc64354 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -19,11 +19,10 @@ #include "Pet.h" #include "PhasingHandler.h" #include "Player.h" -#include "Realm.h" +#include "RealmList.h" #include "SpellAuraEffects.h" #include "SpellAuras.h" #include "Vehicle.h" -#include "World.h" #include "WorldSession.h" WorldPacket const* WorldPackets::Party::PartyCommandResult::Write() @@ -95,7 +94,8 @@ void WorldPackets::Party::PartyInvite::Initialize(Player const* inviter, int32 p ProposedRoles = proposedRoles; - InviterRealm = Auth::VirtualRealmInfo(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName); + if (std::shared_ptr<Realm const> realm = sRealmList->GetRealm(*inviter->m_playerData->VirtualPlayerRealm)) + InviterRealm = Auth::VirtualRealmInfo(realm->Id.GetAddress(), true, false, realm->Name, realm->NormalizedName); } void WorldPackets::Party::PartyInviteResponse::Read() diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index 595738330d3..c912114849d 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -19,9 +19,8 @@ #include "Config.h" #include "GameTime.h" #include "IpAddress.h" -#include "Realm.h" +#include "RealmList.h" #include "Timer.h" -#include "World.h" #include "WorldPacket.h" #pragma pack(push, 1) @@ -98,7 +97,10 @@ void PacketLog::Initialize() header.Signature[0] = 'P'; header.Signature[1] = 'K'; header.Signature[2] = 'T'; header.FormatVersion = 0x0301; header.SnifferId = 'T'; - header.Build = realm.Build; + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + header.Build = currentRealm->Build; + else + header.Build = 0; header.Locale[0] = 'e'; header.Locale[1] = 'n'; header.Locale[2] = 'U'; header.Locale[3] = 'S'; std::memset(header.SessionKey, 0, sizeof(header.SessionKey)); header.SniffStartUnixtime = GameTime::GetGameTime(); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index d8c4d2839c9..ba3bb98d958 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -47,7 +47,7 @@ #include "QueryHolder.h" #include "Random.h" #include "RBAC.h" -#include "Realm.h" +#include "RealmList.h" #include "ScriptMgr.h" #include "SocialMgr.h" #include "WardenWin.h" @@ -106,7 +106,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet) /// WorldSession constructor WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, - std::string os, Minutes timezoneOffset, LocaleConstant locale, uint32 recruiter, bool isARecruiter): + std::string os, Minutes timezoneOffset, uint32 build, LocaleConstant locale, uint32 recruiter, bool isARecruiter): m_muteTime(mute_time), m_timeOutTime(0), AntiDOS(this), @@ -119,6 +119,7 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun m_accountExpansion(expansion), m_expansion(std::min<uint8>(expansion, sWorld->getIntConfig(CONFIG_EXPANSION))), _os(std::move(os)), + _clientBuild(build), _battlenetRequestToken(0), _logoutTime(0), m_inQueue(false), @@ -797,7 +798,9 @@ void WorldSession::Handle_EarlyProccess(WorldPackets::Null& null) void WorldSession::SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial) { boost::system::error_code ignored_error; - boost::asio::ip::address instanceAddress = realm.GetAddressForClient(Trinity::Net::make_address(GetRemoteAddress(), ignored_error)); + boost::asio::ip::address instanceAddress; + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + instanceAddress = currentRealm->GetAddressForClient(Trinity::Net::make_address(GetRemoteAddress(), ignored_error)); _instanceConnectKey.Fields.AccountId = GetAccountId(); _instanceConnectKey.Fields.ConnectionType = CONNECTION_TYPE_INSTANCE; @@ -1020,9 +1023,9 @@ void WorldSession::LoadPermissions() uint8 secLevel = GetSecurity(); TC_LOG_DEBUG("rbac", "WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]", - id, _accountName, realm.Id.Realm, secLevel); + id, _accountName, sRealmList->GetCurrentRealmId().Realm, secLevel); - _RBACData = new rbac::RBACData(id, _accountName, realm.Id.Realm, secLevel); + _RBACData = new rbac::RBACData(id, _accountName, sRealmList->GetCurrentRealmId().Realm, secLevel); _RBACData->LoadFromDB(); } @@ -1032,9 +1035,9 @@ QueryCallback WorldSession::LoadPermissionsAsync() uint8 secLevel = GetSecurity(); TC_LOG_DEBUG("rbac", "WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]", - id, _accountName, realm.Id.Realm, secLevel); + id, _accountName, sRealmList->GetCurrentRealmId().Realm, secLevel); - _RBACData = new rbac::RBACData(id, _accountName, realm.Id.Realm, secLevel); + _RBACData = new rbac::RBACData(id, _accountName, sRealmList->GetCurrentRealmId().Realm, secLevel); return _RBACData->LoadFromDBAsync(); } @@ -1097,7 +1100,7 @@ public: stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BATTLE_PETS); stmt->setUInt32(0, battlenetAccountId); - stmt->setInt32(1, realm.Id.Realm); + stmt->setInt32(1, sRealmList->GetCurrentRealmId().Realm); ok = SetPreparedQuery(BATTLE_PETS, stmt) && ok; stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BATTLE_PET_SLOTS); @@ -1226,7 +1229,7 @@ bool WorldSession::HasPermission(uint32 permission) bool hasPermission = _RBACData->HasPermission(permission); TC_LOG_DEBUG("rbac", "WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]", - _RBACData->GetId(), _RBACData->GetName(), realm.Id.Realm); + _RBACData->GetId(), _RBACData->GetName(), sRealmList->GetCurrentRealmId().Realm); return hasPermission; } @@ -1234,7 +1237,7 @@ bool WorldSession::HasPermission(uint32 permission) void WorldSession::InvalidateRBACData() { TC_LOG_DEBUG("rbac", "WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]", - _RBACData->GetId(), _RBACData->GetName(), realm.Id.Realm); + _RBACData->GetId(), _RBACData->GetName(), sRealmList->GetCurrentRealmId().Realm); delete _RBACData; _RBACData = nullptr; } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index b2f1b06868c..49cc7721504 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -938,7 +938,7 @@ class TC_GAME_API WorldSession { public: WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, - std::string os, Minutes timezoneOffset, LocaleConstant locale, uint32 recruiter, bool isARecruiter); + std::string os, Minutes timezoneOffset, uint32 build, LocaleConstant locale, uint32 recruiter, bool isARecruiter); ~WorldSession(); bool PlayerLoading() const { return !m_playerLoading.IsEmpty(); } @@ -987,6 +987,7 @@ class TC_GAME_API WorldSession uint8 GetAccountExpansion() const { return m_accountExpansion; } uint8 GetExpansion() const { return m_expansion; } std::string const& GetOS() const { return _os; } + uint32 GetClientBuild() const { return _clientBuild; } bool CanAccessAlliedRaces() const; Warden* GetWarden() { return _warden.get(); } @@ -1884,6 +1885,7 @@ class TC_GAME_API WorldSession uint8 m_accountExpansion; uint8 m_expansion; std::string _os; + uint32 _clientBuild; std::array<uint8, 32> _realmListSecret; std::unordered_map<uint32 /*realmAddress*/, uint8> _realmCharacterCounts; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 688c8c5aed0..68783a321ae 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -616,9 +616,7 @@ struct AccountInfo bool IsLockedToIP; std::string LastIP; std::string LockCountry; - LocaleConstant Locale; bool IsBanned; - } BattleNet; struct @@ -627,6 +625,8 @@ struct AccountInfo std::array<uint8, 64> KeyData; uint8 Expansion; int64 MuteTime; + uint32 Build; + LocaleConstant Locale; uint32 Recruiter; std::string OS; Minutes TimezoneOffset; @@ -639,9 +639,9 @@ struct AccountInfo explicit AccountInfo(Field const* fields) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 - // SELECT a.id, a.session_key, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, a.timezone_offset, ba.id, aa.SecurityLevel, - // 13 14 15 + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + // SELECT a.id, a.session_key, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, a.client_build, a.locale, a.recruiter, a.os, a.timezone_offset, ba.id, aa.SecurityLevel, + // 14 15 16 // bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id // FROM account a LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id LEFT JOIN account_access aa ON a.id = aa.AccountID AND aa.RealmID IN (-1, ?) // 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 @@ -653,18 +653,19 @@ struct AccountInfo BattleNet.LockCountry = fields[4].GetString(); Game.Expansion = fields[5].GetUInt8(); Game.MuteTime = fields[6].GetInt64(); - BattleNet.Locale = LocaleConstant(fields[7].GetUInt8()); - Game.Recruiter = fields[8].GetUInt32(); - Game.OS = fields[9].GetString(); - Game.TimezoneOffset = Minutes(fields[10].GetInt16()); - BattleNet.Id = fields[11].GetUInt32(); - Game.Security = AccountTypes(fields[12].GetUInt8()); - BattleNet.IsBanned = fields[13].GetUInt32() != 0; - Game.IsBanned = fields[14].GetUInt32() != 0; - Game.IsRectuiter = fields[15].GetUInt32() != 0; - - if (BattleNet.Locale >= TOTAL_LOCALES) - BattleNet.Locale = LOCALE_enUS; + Game.Build = fields[7].GetUInt32(); + Game.Locale = LocaleConstant(fields[8].GetUInt8()); + Game.Recruiter = fields[9].GetUInt32(); + Game.OS = fields[10].GetString(); + Game.TimezoneOffset = Minutes(fields[11].GetInt16()); + BattleNet.Id = fields[12].GetUInt32(); + Game.Security = AccountTypes(fields[13].GetUInt8()); + BattleNet.IsBanned = fields[14].GetUInt32() != 0; + Game.IsBanned = fields[15].GetUInt32() != 0; + Game.IsRectuiter = fields[16].GetUInt32() != 0; + + if (Game.Locale >= TOTAL_LOCALES) + Game.Locale = LOCALE_enUS; } }; @@ -672,7 +673,7 @@ void WorldSocket::HandleAuthSession(std::shared_ptr<WorldPackets::Auth::AuthSess { // Get the account information from the auth database LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME); - stmt->setInt32(0, int32(realm.Id.Realm)); + stmt->setInt32(0, int32(sRealmList->GetCurrentRealmId().Realm)); stmt->setString(1, authSession->RealmJoinTicket); _queryProcessor.AddCallback(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback([this, authSession = std::move(authSession)](PreparedQueryResult result) mutable @@ -692,17 +693,17 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: return; } - RealmBuildInfo const* buildInfo = sRealmList->GetBuildInfo(realm.Build); + AccountInfo account(result->Fetch()); + + RealmBuildInfo const* buildInfo = sRealmList->GetBuildInfo(account.Game.Build); if (!buildInfo) { SendAuthResponseError(ERROR_BAD_VERSION); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Missing auth seed for realm build {} ({}).", realm.Build, GetRemoteIpAddress().to_string()); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Missing auth seed for realm build {} ({}).", account.Game.Build, GetRemoteIpAddress().to_string()); DelayedCloseSocket(); return; } - AccountInfo account(result->Fetch()); - // For hook purposes, we get Remoteaddress at this point. std::string address = GetRemoteIpAddress().to_string(); @@ -778,11 +779,11 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: return; } - if (authSession->RealmID != realm.Id.Realm) + if (authSession->RealmID != sRealmList->GetCurrentRealmId().Realm) { SendAuthResponseError(ERROR_DENIED); TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client {} requested connecting with realm id {} but this realm has id {} set in config.", - GetRemoteIpAddress().to_string(), authSession->RealmID, realm.Id.Realm); + GetRemoteIpAddress().to_string(), authSession->RealmID, sRealmList->GetCurrentRealmId().Realm); DelayedCloseSocket(); return; } @@ -877,7 +878,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: _authed = true; _worldSession = new WorldSession(account.Game.Id, std::move(authSession->RealmJoinTicket), account.BattleNet.Id, shared_from_this(), account.Game.Security, - account.Game.Expansion, mutetime, account.Game.OS, account.Game.TimezoneOffset, account.BattleNet.Locale, account.Game.Recruiter, account.Game.IsRectuiter); + account.Game.Expansion, mutetime, account.Game.OS, account.Game.TimezoneOffset, account.Game.Build, account.Game.Locale, account.Game.Recruiter, account.Game.IsRectuiter); // Initialize Warden system only if it is enabled by config if (wardenActive) diff --git a/src/server/game/Services/ClubUtils.cpp b/src/server/game/Services/ClubUtils.cpp index 7147b2367b1..ec85e4a4a7c 100644 --- a/src/server/game/Services/ClubUtils.cpp +++ b/src/server/game/Services/ClubUtils.cpp @@ -16,10 +16,9 @@ */ #include "ClubUtils.h" -#include "Realm.h" -#include "World.h" +#include "RealmList.h" uint64 Battlenet::Services::Clubs::CreateClubMemberId(ObjectGuid guid) { - return guid.GetCounter() | (uint64(realm.Id.Realm & 0xFFF) << 48); + return guid.GetCounter() | (uint64(sRealmList->GetCurrentRealmId().Realm & 0xFFF) << 48); } diff --git a/src/server/game/Services/WorldserverGameUtilitiesService.cpp b/src/server/game/Services/WorldserverGameUtilitiesService.cpp index 63c8223c72f..94a41a8a24f 100644 --- a/src/server/game/Services/WorldserverGameUtilitiesService.cpp +++ b/src/server/game/Services/WorldserverGameUtilitiesService.cpp @@ -20,10 +20,8 @@ #include "IpAddress.h" #include "Log.h" #include "ProtobufJSON.h" -#include "Realm.h" #include "RealmList.h" #include "RealmList.pb.h" -#include "World.h" #include <zlib.h> std::unordered_map<std::string, Battlenet::Services::GameUtilitiesService::ClientRequestHandler> const Battlenet::Services::GameUtilitiesService::ClientRequestHandlers = @@ -89,7 +87,7 @@ uint32 Battlenet::Services::GameUtilitiesService::HandleRealmListRequest(std::un if (Variant const* subRegion = GetParam(params, "Command_RealmListRequest_v1")) subRegionId = subRegion->string_value(); - std::vector<uint8> compressed = sRealmList->GetRealmList(realm.Build, subRegionId); + std::vector<uint8> compressed = sRealmList->GetRealmList(_session->GetClientBuild(), _session->GetSecurity(), subRegionId); if (compressed.empty()) return ERROR_UTIL_SERVER_FAILED_TO_SERIALIZE_RESPONSE; @@ -125,8 +123,8 @@ uint32 Battlenet::Services::GameUtilitiesService::HandleRealmListRequest(std::un uint32 Battlenet::Services::GameUtilitiesService::HandleRealmJoinRequest(std::unordered_map<std::string, Variant const*> const& params, game_utilities::v1::ClientResponse* response) { if (Variant const* realmAddress = GetParam(params, "Param_RealmAddress")) - return sRealmList->JoinRealm(uint32(realmAddress->uint_value()), realm.Build, Trinity::Net::make_address(_session->GetRemoteAddress()), _session->GetRealmListSecret(), - _session->GetSessionDbcLocale(), _session->GetOS(), _session->GetTimezoneOffset(), _session->GetAccountName(), response); + return sRealmList->JoinRealm(uint32(realmAddress->uint_value()), _session->GetClientBuild(), Trinity::Net::make_address(_session->GetRemoteAddress()), _session->GetRealmListSecret(), + _session->GetSessionDbcLocale(), _session->GetOS(), _session->GetTimezoneOffset(), _session->GetAccountName(), _session->GetSecurity(), response); return ERROR_WOW_SERVICES_INVALID_JOIN_TICKET; } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index f492880fb65..cd4986d2c32 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -81,7 +81,7 @@ #include "PlayerDump.h" #include "PoolMgr.h" #include "QuestPools.h" -#include "Realm.h" +#include "RealmList.h" #include "ScenarioMgr.h" #include "ScriptMgr.h" #include "ScriptReloadMgr.h" @@ -244,12 +244,8 @@ void World::SetClosed(bool val) void World::LoadDBAllowedSecurityLevel() { - LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL); - stmt->setInt32(0, int32(realm.Id.Realm)); - PreparedQueryResult result = LoginDatabase.Query(stmt); - - if (result) - SetPlayerSecurityLimit(AccountTypes(result->Fetch()->GetUInt8())); + if (std::shared_ptr<Realm const> currentRealm = sRealmList->GetCurrentRealm()) + SetPlayerSecurityLimit(currentRealm->AllowedSecurityLevel); } void World::SetPlayerSecurityLimit(AccountTypes _sec) @@ -429,7 +425,12 @@ void World::AddSession_(WorldSession* s) { float popu = (float)GetActiveSessionCount(); // updated number of users on the server popu /= pLimit; - popu *= 2; + + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REALM_POPULATION); + stmt->setFloat(0, popu); + stmt->setUInt32(1, sRealmList->GetCurrentRealmId().Realm); + LoginDatabase.Execute(stmt); + TC_LOG_INFO("misc", "Server Population ({}).", popu); } } @@ -1734,7 +1735,7 @@ void World::LoadConfigSettings(bool reload) /// Initialize the World bool World::SetInitialWorldSettings() { - sLog->SetRealmId(realm.Id.Realm); + sLog->SetRealmId(sRealmList->GetCurrentRealmId().Realm); ///- Server startup begin uint32 startupBegin = getMSTime(); @@ -1793,7 +1794,7 @@ bool World::SetInitialWorldSettings() uint32 server_type = IsFFAPvPRealm() ? uint32(REALM_TYPE_PVP) : getIntConfig(CONFIG_GAME_TYPE); uint32 realm_zone = getIntConfig(CONFIG_REALM_ZONE); - LoginDatabase.PExecute("UPDATE realmlist SET icon = {}, timezone = {} WHERE id = '{}'", server_type, realm_zone, realm.Id.Realm); // One-time query + LoginDatabase.PExecute("UPDATE realmlist SET icon = {}, timezone = {} WHERE id = '{}'", server_type, realm_zone, sRealmList->GetCurrentRealmId().Realm); // One-time query TC_LOG_INFO("server.loading", "Initialize data stores..."); ///- Load DB2s @@ -2422,7 +2423,7 @@ bool World::SetInitialWorldSettings() GameTime::UpdateGameTimers(); LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES({}, {}, 0, '{}')", - realm.Id.Realm, uint32(GameTime::GetStartTime()), GitRevision::GetFullVersion()); // One-time query + sRealmList->GetCurrentRealmId().Realm, uint32(GameTime::GetStartTime()), GitRevision::GetFullVersion()); // One-time query m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS_PENDING].SetInterval(250); @@ -2574,7 +2575,7 @@ void World::LoadAutobroadcasts() m_Autobroadcasts.clear(); LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST); - stmt->setInt32(0, realm.Id.Realm); + stmt->setInt32(0, sRealmList->GetCurrentRealmId().Realm); PreparedQueryResult result = LoginDatabase.Query(stmt); if (!result) @@ -2753,7 +2754,7 @@ void World::Update(uint32 diff) stmt->setUInt32(0, tmpDiff); stmt->setUInt16(1, uint16(maxOnlinePlayers)); - stmt->setUInt32(2, realm.Id.Realm); + stmt->setUInt32(2, sRealmList->GetCurrentRealmId().Realm); stmt->setUInt32(3, uint32(GameTime::GetStartTime())); LoginDatabase.Execute(stmt); @@ -2771,7 +2772,7 @@ void World::Update(uint32 diff) stmt->setUInt32(0, getIntConfig(CONFIG_LOGDB_CLEARTIME)); stmt->setUInt32(1, uint32(GameTime::GetGameTime())); - stmt->setUInt32(2, realm.Id.Realm); + stmt->setUInt32(2, sRealmList->GetCurrentRealmId().Realm); LoginDatabase.Execute(stmt); } @@ -3535,7 +3536,7 @@ void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount) LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_REALM_CHARACTERS); stmt->setUInt8(0, charCount); stmt->setUInt32(1, accountId); - stmt->setUInt32(2, realm.Id.Realm); + stmt->setUInt32(2, sRealmList->GetCurrentRealmId().Realm); trans->Append(stmt); LoginDatabase.CommitTransaction(trans); @@ -3989,11 +3990,9 @@ void World::UpdateWarModeRewardValues() sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (dominantFaction == TEAM_HORDE ? outnumberedFactionReward : 0), false, nullptr); } -Realm realm; - uint32 GetVirtualRealmAddress() { - return realm.Id.GetAddress(); + return sRealmList->GetCurrentRealmId().GetAddress(); } CliCommandHolder::CliCommandHolder(void* callbackArg, char const* command, Print zprint, CommandFinished commandFinished) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 4d6ef2211f5..56892b85884 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -42,7 +42,6 @@ class Player; class WorldPacket; class WorldSession; class WorldSocket; -struct Realm; // ServerMessages.dbc enum ServerMessageType @@ -925,8 +924,6 @@ class TC_GAME_API World friend class debug_commandscript; }; -TC_GAME_API extern Realm realm; - TC_GAME_API uint32 GetVirtualRealmAddress(); #define sWorld World::instance() |
