diff options
Diffstat (limited to 'src')
41 files changed, 540 insertions, 415 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index f6d0de1a64f..4118ea902f5 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -22,6 +22,7 @@ #include "AccountMgr.h" #include "Bag.h" #include "DB2Stores.h" +#include "CharacterCache.h" #include "Common.h" #include "DatabaseEnv.h" #include "Language.h" @@ -128,10 +129,10 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& } else { - bidderAccId = ObjectMgr::GetPlayerAccountIdByGUID(bidderGuid); + bidderAccId = sCharacterCache->GetCharacterAccountIdByGuid(bidderGuid); logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm); - if (logGmTrade && !ObjectMgr::GetPlayerNameByGUID(bidderGuid, bidderName)) + if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(bidderGuid, bidderName)) bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); } @@ -139,10 +140,10 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& { ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(auction->owner); std::string ownerName; - if (!ObjectMgr::GetPlayerNameByGUID(ownerGuid, ownerName)) + if (!sCharacterCache->GetCharacterNameByGuid(ownerGuid, ownerName)) ownerName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); - uint32 ownerAccId = ObjectMgr::GetPlayerAccountIdByGUID(ownerGuid); + uint32 ownerAccId = sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid); sLog->outCommand(bidderAccId, "GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: " UI64FMTD ". Original owner %s (Account: %u)", bidderName.c_str(), bidderAccId, item->GetTemplate()->GetDefaultLocaleName(), item->GetEntry(), item->GetCount(), auction->bid, ownerName.c_str(), ownerAccId); @@ -180,7 +181,7 @@ void AuctionHouseMgr::SendAuctionSalePendingMail(AuctionEntry* auction, SQLTrans { ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); - uint32 owner_accId = ObjectMgr::GetPlayerAccountIdByGUID(owner_guid); + uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); // owner exist (online or offline) if ((owner || owner_accId) && !sAuctionBotConfig->IsBotChar(auction->owner)) MailDraft(auction->BuildAuctionMailSubject(AUCTION_SALE_PENDING), AuctionEntry::BuildAuctionMailBody(auction->bidder, auction->bid, auction->buyout, auction->deposit, auction->GetAuctionCut())) @@ -192,7 +193,7 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa { ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); - uint32 owner_accId = ObjectMgr::GetPlayerAccountIdByGUID(owner_guid); + uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); Item* item = GetAItem(auction->itemGUIDLow); // owner exist @@ -225,7 +226,7 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, SQLTransacti ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); - uint32 owner_accId = ObjectMgr::GetPlayerAccountIdByGUID(owner_guid); + uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); // owner exist if ((owner || owner_accId) && !sAuctionBotConfig->IsBotChar(auction->owner)) { @@ -251,7 +252,7 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint64 /*n uint32 oldBidder_accId = 0; if (!oldBidder) - oldBidder_accId = ObjectMgr::GetPlayerAccountIdByGUID(oldBidder_guid); + oldBidder_accId = sCharacterCache->GetCharacterAccountIdByGuid(oldBidder_guid); Item* item = GetAItem(auction->itemGUIDLow); @@ -276,7 +277,7 @@ void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQ uint32 bidder_accId = 0; if (!bidder) - bidder_accId = ObjectMgr::GetPlayerAccountIdByGUID(bidder_guid); + bidder_accId = sCharacterCache->GetCharacterAccountIdByGuid(bidder_guid); // bidder exist if ((bidder || bidder_accId) && !sAuctionBotConfig->IsBotChar(auction->bidder)) @@ -804,7 +805,7 @@ void AuctionEntry::BuildAuctionInfo(std::vector<WorldPackets::AuctionHouse::Auct auctionItem.ItemGuid = item->GetGUID(); auctionItem.MinBid = startbid; auctionItem.Owner = ObjectGuid::Create<HighGuid::Player>(owner); - auctionItem.OwnerAccountID = ObjectGuid::Create<HighGuid::WowAccount>(ObjectMgr::GetPlayerAccountIdByGUID(auctionItem.Owner)); + auctionItem.OwnerAccountID = ObjectGuid::Create<HighGuid::WowAccount>(sCharacterCache->GetCharacterAccountIdByGuid(auctionItem.Owner)); auctionItem.MinIncrement = bidder ? GetAuctionOutBid() : 0; auctionItem.Bidder = bidder ? ObjectGuid::Create<HighGuid::Player>(bidder) : ObjectGuid::Empty; auctionItem.BidAmount = bidder ? bid : 0; diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 61661093479..f23240c5cc4 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -18,6 +18,7 @@ #include "ArenaTeam.h" #include "ArenaTeamMgr.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Group.h" #include "Log.h" @@ -98,14 +99,14 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) if (GetMembersSize() >= GetType() * 2) return false; - // Get player name and class either from db or ObjectMgr + // Get player name and class either from db or character cache Player* player = ObjectAccessor::FindPlayer(playerGuid); if (player) { playerClass = player->getClass(); playerName = player->GetName(); } - else if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(playerGuid)) + else if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(playerGuid)) { playerName = characterInfo->Name; playerClass = characterInfo->Class; @@ -114,7 +115,7 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) return false; // Check if player is already in a similar arena team - if ((player && player->GetArenaTeamId(GetSlot())) || Player::GetArenaTeamIdFromCharacterInfo(playerGuid, GetType()) != 0) + if ((player && player->GetArenaTeamId(GetSlot())) || sCharacterCache->GetCharacterArenaTeamIdByGuid(playerGuid, GetType()) != 0) { TC_LOG_DEBUG("bg.arena", "Arena: %s %s already has an arena team of type %u", playerGuid.ToString().c_str(), playerName.c_str(), GetType()); return false; @@ -157,7 +158,7 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) newMember.MatchMakerRating = matchMakerRating; Members.push_back(newMember); - sWorld->UpdateCharacterArenaTeamId(playerGuid, GetSlot(), GetId()); + sCharacterCache->UpdateCharacterArenaTeamId(playerGuid, GetSlot(), GetId()); // Save player's arena team membership to db stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ARENA_TEAM_MEMBER); @@ -253,7 +254,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result) // Put the player in the team Members.push_back(newMember); - sWorld->UpdateCharacterArenaTeamId(newMember.Guid, GetSlot(), GetId()); + sCharacterCache->UpdateCharacterArenaTeamId(newMember.Guid, GetSlot(), GetId()); } while (result->NextRow()); @@ -317,7 +318,7 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb) if (itr->Guid == guid) { Members.erase(itr); - sWorld->UpdateCharacterArenaTeamId(guid, GetSlot(), 0); + sCharacterCache->UpdateCharacterArenaTeamId(guid, GetSlot(), 0); break; } } @@ -367,7 +368,7 @@ void ArenaTeam::Disband(WorldSession* session) CharacterDatabase.CommitTransaction(trans); - // Remove arena team from ObjectMgr + // Remove arena team from ArenaTeamMgr sArenaTeamMgr->RemoveArenaTeam(TeamId); } @@ -390,7 +391,7 @@ void ArenaTeam::Disband() CharacterDatabase.CommitTransaction(trans); - // Remove arena team from ObjectMgr + // Remove arena team from ArenaTeamMgr sArenaTeamMgr->RemoveArenaTeam(TeamId); } diff --git a/src/server/game/BlackMarket/BlackMarketMgr.cpp b/src/server/game/BlackMarket/BlackMarketMgr.cpp index 6efacb529e2..fb548031f56 100644 --- a/src/server/game/BlackMarket/BlackMarketMgr.cpp +++ b/src/server/game/BlackMarket/BlackMarketMgr.cpp @@ -18,6 +18,7 @@ #include "BlackMarketMgr.h" #include "AccountMgr.h" #include "BlackMarketPackets.h" +#include "CharacterCache.h" #include "Containers.h" #include "DatabaseEnv.h" #include "Item.h" @@ -278,13 +279,13 @@ void BlackMarketMgr::SendAuctionWonMail(BlackMarketEntry* entry, SQLTransaction& } else { - bidderAccId = ObjectMgr::GetPlayerAccountIdByGUID(bidderGuid); + bidderAccId = sCharacterCache->GetCharacterAccountIdByGuid(bidderGuid); if (!bidderAccId) // Account exists return; logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm); - if (logGmTrade && !ObjectMgr::GetPlayerNameByGUID(bidderGuid, bidderName)) + if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(bidderGuid, bidderName)) bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); } @@ -324,7 +325,7 @@ void BlackMarketMgr::SendAuctionOutbidMail(BlackMarketEntry* entry, SQLTransacti uint32 oldBidder_accId = 0; if (!oldBidder) - oldBidder_accId = ObjectMgr::GetPlayerAccountIdByGUID(oldBidder_guid); + oldBidder_accId = sCharacterCache->GetCharacterAccountIdByGuid(oldBidder_guid); // old bidder exist if (!oldBidder && !oldBidder_accId) @@ -435,7 +436,7 @@ bool BlackMarketEntry::LoadFromDB(Field* fields) _bidder = fields[4].GetUInt64(); // Either no bidder or existing player - if (_bidder && !sObjectMgr->GetPlayerAccountIdByGUID(ObjectGuid::Create<HighGuid::Player>(_bidder))) // Probably a better way to check if player exists + if (_bidder && !sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid::Create<HighGuid::Player>(_bidder))) // Probably a better way to check if player exists { TC_LOG_ERROR("misc", "Black market auction %i does not have a valid bidder (GUID: " UI64FMTD " ).", _marketId, _bidder); return false; diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp new file mode 100644 index 00000000000..4f66fd5f90e --- /dev/null +++ b/src/server/game/Cache/CharacterCache.cpp @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2008-2019 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 "CharacterCache.h" +#include "ArenaTeam.h" +#include "DatabaseEnv.h" +#include "Log.h" +#include "Player.h" +#include "Timer.h" +#include "World.h" +#include "WorldPacket.h" +#include <unordered_map> + +namespace +{ + std::unordered_map<ObjectGuid, CharacterCacheEntry> _characterCacheStore; + std::unordered_map<std::string, CharacterCacheEntry*> _characterCacheByNameStore; +} + +CharacterCache::CharacterCache() +{ +} + +CharacterCache::~CharacterCache() +{ +} + +CharacterCache* CharacterCache::instance() +{ + static CharacterCache instance; + return &instance; +} + +/** +* @brief Loads several pieces of information on server startup with the GUID +* There is no further database query necessary. +* These are a number of methods that work into the calling function. +* +* @param guid Requires a guid to call +* @return Name, Gender, Race, Class and Level of player character +* Example Usage: +* @code +* CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(GUID); +* if (!characterInfo) +* return; +* +* std::string playerName = characterInfo->Name; +* uint8 playerGender = characterInfo->Sex; +* uint8 playerRace = characterInfo->Race; +* uint8 playerClass = characterInfo->Class; +* uint8 playerLevel = characterInfo->Level; +* @endcode +**/ + +void CharacterCache::LoadCharacterCacheStorage() +{ + _characterCacheStore.clear(); + uint32 oldMSTime = getMSTime(); + + QueryResult result = CharacterDatabase.Query("SELECT guid, name, account, race, gender, class, level, deleteDate FROM characters"); + if (!result) + { + TC_LOG_INFO("server.loading", "No character name data loaded, empty query"); + return; + } + + do + { + Field* fields = result->Fetch(); + AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32()) /*guid*/, fields[2].GetUInt32() /*account*/, fields[1].GetString() /*name*/, + fields[4].GetUInt8() /*gender*/, fields[3].GetUInt8() /*race*/, fields[5].GetUInt8() /*class*/, fields[6].GetUInt8() /*level*/, fields[7].GetUInt32() != 0); + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", "Loaded character infos for " SZFMTD " characters in %u ms", _characterCacheStore.size(), GetMSTimeDiffToNow(oldMSTime)); +} + +/* +Modifying functions +*/ +void CharacterCache::AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, bool isDeleted) +{ + CharacterCacheEntry& data = _characterCacheStore[guid]; + data.Guid = guid; + data.Name = name; + data.AccountId = accountId; + data.Race = race; + data.Sex = gender; + data.Class = playerClass; + data.Level = level; + data.GuildId = 0; // Will be set in guild loading or guild setting + for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i) + data.ArenaTeamId[i] = 0; // Will be set in arena teams loading + data.IsDeleted = isDeleted; + + // Fill Name to Guid Store + _characterCacheByNameStore[name] = &data; +} + +void CharacterCache::DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name) +{ + _characterCacheStore.erase(guid); + _characterCacheByNameStore.erase(name); +} + +void CharacterCache::UpdateCharacterData(ObjectGuid const& guid, std::string const& name, uint8* gender /*= nullptr*/, uint8* race /*= nullptr*/) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + std::string oldName = itr->second.Name; + itr->second.Name = name; + + if (gender) + itr->second.Sex = *gender; + + if (race) + itr->second.Race = *race; + + WorldPacket data(SMSG_INVALIDATE_PLAYER, 8); + data << guid; + sWorld->SendGlobalMessage(&data); + + // Correct name -> pointer storage + _characterCacheByNameStore.erase(oldName); + _characterCacheByNameStore[name] = &itr->second; +} + +void CharacterCache::UpdateCharacterLevel(ObjectGuid const& guid, uint8 level) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.Level = level; +} + +void CharacterCache::UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.AccountId = accountId; +} + +void CharacterCache::UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.GuildId = guildId; +} + +void CharacterCache::UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.ArenaTeamId[slot] = arenaTeamId; +} + +void CharacterCache::UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name /*=nullptr*/) +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return; + + itr->second.IsDeleted = deleted; + + if (name) + itr->second.Name = *name; +} + + +/* +Getters +*/ +bool CharacterCache::HasCharacterCacheEntry(ObjectGuid const& guid) const +{ + return _characterCacheStore.find(guid) != _characterCacheStore.end(); +} + +CharacterCacheEntry const* CharacterCache::GetCharacterCacheByGuid(ObjectGuid const& guid) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr != _characterCacheStore.end()) + return &itr->second; + + return nullptr; +} + +CharacterCacheEntry const* CharacterCache::GetCharacterCacheByName(std::string const& name) const +{ + auto itr = _characterCacheByNameStore.find(name); + if (itr != _characterCacheByNameStore.end()) + return itr->second; + + return nullptr; +} + +ObjectGuid CharacterCache::GetCharacterGuidByName(std::string const& name) const +{ + auto itr = _characterCacheByNameStore.find(name); + if (itr != _characterCacheByNameStore.end()) + return itr->second->Guid; + + return ObjectGuid::Empty; +} + +bool CharacterCache::GetCharacterNameByGuid(ObjectGuid guid, std::string& name) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return false; + + name = itr->second.Name; + return true; +} + +uint32 CharacterCache::GetCharacterTeamByGuid(ObjectGuid guid) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return 0; + + return Player::TeamForRace(itr->second.Race); +} + +uint32 CharacterCache::GetCharacterAccountIdByGuid(ObjectGuid guid) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return 0; + + return itr->second.AccountId; +} + +uint32 CharacterCache::GetCharacterAccountIdByName(std::string const& name) const +{ + auto itr = _characterCacheByNameStore.find(name); + if (itr != _characterCacheByNameStore.end()) + return itr->second->AccountId; + + return 0; +} + +uint8 CharacterCache::GetCharacterLevelByGuid(ObjectGuid guid) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return 0; + + return itr->second.Level; +} + +ObjectGuid::LowType CharacterCache::GetCharacterGuildIdByGuid(ObjectGuid guid) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return 0; + + return itr->second.GuildId; +} + +uint32 CharacterCache::GetCharacterArenaTeamIdByGuid(ObjectGuid guid, uint8 type) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return 0; + + return itr->second.ArenaTeamId[ArenaTeam::GetSlotByType(type)]; +} + +bool CharacterCache::GetCharacterNameAndClassByGUID(ObjectGuid guid, std::string& name, uint8& _class) const +{ + auto itr = _characterCacheStore.find(guid); + if (itr == _characterCacheStore.end()) + return false; + + name = itr->second.Name; + _class = itr->second.Class; + return true; +} + diff --git a/src/server/game/Cache/CharacterCache.h b/src/server/game/Cache/CharacterCache.h new file mode 100644 index 00000000000..be9302aa8f5 --- /dev/null +++ b/src/server/game/Cache/CharacterCache.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2008-2019 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 CharacterCache_h__ +#define CharacterCache_h__ + +#include "Define.h" +#include "ObjectGuid.h" +#include <string> + +struct CharacterCacheEntry +{ + ObjectGuid Guid; + std::string Name; + uint32 AccountId; + uint8 Class; + uint8 Race; + uint8 Sex; + uint8 Level; + ObjectGuid::LowType GuildId; + uint32 ArenaTeamId[3]; + bool IsDeleted; +}; + +class TC_GAME_API CharacterCache +{ + public: + CharacterCache(); + ~CharacterCache(); + static CharacterCache* instance(); + + void LoadCharacterCacheStorage(); + void AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, bool isDeleted); + void DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name); + + void UpdateCharacterData(ObjectGuid const& guid, std::string const& name, uint8* gender = nullptr, uint8* race = nullptr); + void UpdateCharacterLevel(ObjectGuid const& guid, uint8 level); + void UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId); + void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); + void UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId); + void UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name = nullptr); + + bool HasCharacterCacheEntry(ObjectGuid const& guid) const; + CharacterCacheEntry const* GetCharacterCacheByGuid(ObjectGuid const& guid) const; + CharacterCacheEntry const* GetCharacterCacheByName(std::string const& name) const; + + ObjectGuid GetCharacterGuidByName(std::string const& name) const; + bool GetCharacterNameByGuid(ObjectGuid guid, std::string& name) const; + uint32 GetCharacterTeamByGuid(ObjectGuid guid) const; + uint32 GetCharacterAccountIdByGuid(ObjectGuid guid) const; + uint32 GetCharacterAccountIdByName(std::string const& name) const; + uint8 GetCharacterLevelByGuid(ObjectGuid guid) const; + ObjectGuid::LowType GetCharacterGuildIdByGuid(ObjectGuid guid) const; + uint32 GetCharacterArenaTeamIdByGuid(ObjectGuid guid, uint8 type) const; + bool GetCharacterNameAndClassByGUID(ObjectGuid guid, std::string& name, uint8& _class) const; +}; + +#define sCharacterCache CharacterCache::instance() + +#endif // CharacterCache_h__ diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index c699c2e075c..b12cf61d361 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -17,6 +17,7 @@ #include "CalendarMgr.h" #include "CalendarPackets.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Guild.h" #include "GuildMgr.h" @@ -78,7 +79,7 @@ void CalendarMgr::LoadFromDB() ObjectGuid::LowType guildID = UI64LIT(0); if (flags & CALENDAR_FLAG_GUILD_EVENT || flags & CALENDAR_FLAG_WITHOUT_INVITES) - guildID = Player::GetGuildIdFromCharacterInfo(ownerGUID); + guildID = sCharacterCache->GetCharacterGuildIdByGuid(ownerGUID); CalendarEvent* calendarEvent = new CalendarEvent(eventID, ownerGUID, guildID, type, textureID, time_t(date), flags, title, description, time_t(lockDate)); _events.insert(calendarEvent); @@ -433,7 +434,7 @@ void CalendarMgr::SendCalendarEventInvite(CalendarInvite const& invite) ObjectGuid invitee = invite.GetInviteeGUID(); Player* player = ObjectAccessor::FindConnectedPlayer(invitee); - uint8 level = player ? player->getLevel() : Player::GetLevelFromCharacterInfo(invitee); + uint8 level = player ? player->getLevel() : sCharacterCache->GetCharacterLevelByGuid(invitee); WorldPackets::Calendar::SCalendarEventInvite packet; packet.EventID = calendarEvent ? calendarEvent->GetEventId() : 0; @@ -572,8 +573,8 @@ void CalendarMgr::SendCalendarEvent(ObjectGuid guid, CalendarEvent const& calend ObjectGuid inviteeGuid = calendarInvite->GetInviteeGUID(); Player* invitee = ObjectAccessor::FindPlayer(inviteeGuid); - uint8 inviteeLevel = invitee ? invitee->getLevel() : Player::GetLevelFromCharacterInfo(inviteeGuid); - ObjectGuid::LowType inviteeGuildId = invitee ? invitee->GetGuildId() : Player::GetGuildIdFromCharacterInfo(inviteeGuid); + uint8 inviteeLevel = invitee ? invitee->getLevel() : sCharacterCache->GetCharacterLevelByGuid(inviteeGuid); + ObjectGuid::LowType inviteeGuildId = invitee ? invitee->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(inviteeGuid); WorldPackets::Calendar::CalendarEventInviteInfo inviteInfo; inviteInfo.Guid = inviteeGuid; diff --git a/src/server/game/Chat/Channels/ChannelAppenders.h b/src/server/game/Chat/Channels/ChannelAppenders.h index 264d2a655aa..fc111bc384e 100644 --- a/src/server/game/Chat/Channels/ChannelAppenders.h +++ b/src/server/game/Chat/Channels/ChannelAppenders.h @@ -20,6 +20,7 @@ #include "Channel.h" #include "ChannelPackets.h" +#include "CharacterCache.h" #include "World.h" // initial packet data (notify type and channel name) @@ -184,7 +185,7 @@ struct ChannelOwnerAppend { explicit ChannelOwnerAppend(Channel const* channel, ObjectGuid const& ownerGuid) : _channel(channel), _ownerGuid(ownerGuid) { - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(_ownerGuid)) + if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(_ownerGuid)) _ownerName = characterInfo->Name; } diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 2e2336f63da..c090b1c1225 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -19,6 +19,7 @@ #include "Chat.h" #include "AccountMgr.h" #include "CellImpl.h" +#include "CharacterCache.h" #include "ChatLink.h" #include "ChatPackets.h" #include "Common.h" @@ -107,7 +108,7 @@ bool ChatHandler::HasLowerSecurity(Player* target, ObjectGuid guid, bool strong) if (target) target_session = target->GetSession(); else if (!guid.IsEmpty()) - target_account = ObjectMgr::GetPlayerAccountIdByGUID(guid); + target_account = sCharacterCache->GetCharacterAccountIdByGuid(guid); if (!target_session && !target_account) { @@ -937,7 +938,7 @@ ObjectGuid::LowType ChatHandler::extractLowGuidFromLink(char* text, HighGuid& gu if (Player* player = ObjectAccessor::FindPlayerByName(name)) return player->GetGUID().GetCounter(); - ObjectGuid guid = sWorld->GetCharacterGuidByName(name); + ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(name); if (guid.IsEmpty()) return 0; @@ -994,7 +995,7 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, ObjectGuid* p *player = pl; // if need guid value from DB (in name case for check player existence) - ObjectGuid guid = !pl && (player_guid || player_name) ? sWorld->GetCharacterGuidByName(name) : ObjectGuid::Empty; + ObjectGuid guid = !pl && (player_guid || player_name) ? sCharacterCache->GetCharacterGuidByName(name) : ObjectGuid::Empty; // if allowed player guid (if no then only online players allowed) if (player_guid) @@ -1153,7 +1154,7 @@ bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player*& player player = ObjectAccessor::FindPlayerByName(name); if (offline) - guid = sWorld->GetCharacterGuidByName(name); + guid = sCharacterCache->GetCharacterGuidByName(name); } } diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 2934d3cda98..23052bd7ff6 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -16,6 +16,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "CharacterCache.h" #include "Common.h" #include "Corpse.h" #include "DatabaseEnv.h" @@ -209,7 +210,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) bool Corpse::IsExpired(time_t t) const { // Deleted character - if (!sWorld->GetCharacterInfo(GetOwnerGUID())) + if (!sCharacterCache->HasCharacterCacheEntry(GetOwnerGUID())) return true; if (m_type == CORPSE_BONES) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c668944d843..fbca88492f5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -35,6 +35,7 @@ #include "CellImpl.h" #include "Channel.h" #include "ChannelMgr.h" +#include "CharacterCache.h" #include "CharacterDatabaseCleaner.h" #include "CharacterTemplateDataStore.h" #include "CharacterPackets.h" @@ -3790,7 +3791,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe // Convert guid to low GUID for CharacterNameData, but also other methods on success ObjectGuid::LowType guid = playerguid.GetCounter(); uint32 charDeleteMethod = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD); - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(playerguid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(playerguid); std::string name; if (characterInfo) name = characterInfo->Name; @@ -3816,7 +3817,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe } SQLTransaction trans = CharacterDatabase.BeginTransaction(); - if (ObjectGuid::LowType guildId = Player::GetGuildIdFromCharacterInfo(playerguid)) + if (ObjectGuid::LowType guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerguid)) if (Guild* guild = sGuildMgr->GetGuildById(guildId)) guild->DeleteMember(trans, playerguid, false, false, true); @@ -3922,7 +3923,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt32(0, mail_id); trans->Append(stmt); - uint32 pl_account = ObjectMgr::GetPlayerAccountIdByGUID(playerguid); + uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(playerguid); draft.AddMoney(money).SendReturnToSender(pl_account, guid, sender, trans); } @@ -4165,7 +4166,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe Garrison::DeleteFromDB(guid, trans); - sWorld->DeleteCharacterInfo(playerguid, name); + sCharacterCache->DeleteCharacterCacheEntry(playerguid, name); break; } // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame @@ -4174,7 +4175,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO); stmt->setUInt64(0, guid); trans->Append(stmt); - sWorld->UpdateCharacterInfoDeleted(playerguid, true); + sCharacterCache->UpdateCharacterInfoDeleted(playerguid, true); break; } default: @@ -6941,16 +6942,7 @@ void Player::SetInGuild(ObjectGuid::LowType guildId) RemovePlayerFlag(PLAYER_FLAGS_GUILD_LEVEL_ENABLED); } - sWorld->UpdateCharacterGuildId(GetGUID(), guildId); -} - -ObjectGuid::LowType Player::GetGuildIdFromCharacterInfo(ObjectGuid guid) -{ - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); - if (!characterInfo) - return UI64LIT(0); - - return characterInfo->GuildId; + sCharacterCache->UpdateCharacterGuildId(GetGUID(), guildId); } void Player::SetArenaTeamInfoField(uint8 /*slot*/, ArenaTeamInfoType /*type*/, uint32 /*value*/) @@ -6963,15 +6955,6 @@ void Player::SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type) SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, type); } -uint32 Player::GetArenaTeamIdFromCharacterInfo(ObjectGuid guid, uint8 type) -{ - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); - if (!characterInfo) - return 0; - - return characterInfo->ArenaTeamId[type]; -} - uint32 Player::GetZoneIdFromDB(ObjectGuid guid) { ObjectGuid::LowType guidLow = guid.GetCounter(); @@ -7018,15 +7001,6 @@ uint32 Player::GetZoneIdFromDB(ObjectGuid guid) return zone; } -uint32 Player::GetLevelFromCharacterInfo(ObjectGuid guid) -{ - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); - if (!characterInfo) - return 0; - - return characterInfo->Level; -} - void Player::UpdateArea(uint32 newArea) { // FFA_PVP flags are area and not zone id dependent @@ -17568,7 +17542,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (!result) { std::string name = "<unknown>"; - ObjectMgr::GetPlayerNameByGUID(guid, name); + sCharacterCache->GetCharacterNameByGuid(guid, name); TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player '%s' (%s) not found in table `characters`, can't load. ", name.c_str(), guid.ToString().c_str()); return false; } @@ -22014,7 +21988,7 @@ void Player::RemovePetitionsAndSigns(ObjectGuid guid) void Player::LeaveAllArenaTeams(ObjectGuid guid) { - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid); if (!characterInfo) return; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b027fa928e5..73f37ecd97f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1438,7 +1438,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> static uint32 GetUInt32ValueFromArray(Tokenizer const& data, uint16 index); static float GetFloatValueFromArray(Tokenizer const& data, uint16 index); static uint32 GetZoneIdFromDB(ObjectGuid guid); - static uint32 GetLevelFromCharacterInfo(ObjectGuid guid); static bool LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, ObjectGuid guid); static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; } @@ -1705,14 +1704,12 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> ObjectGuid::LowType GetGuildId() const { return m_unitData->GuildGUID->GetCounter(); /* return only lower part */ } Guild* GetGuild(); Guild const* GetGuild() const; - static ObjectGuid::LowType GetGuildIdFromCharacterInfo(ObjectGuid guid); ObjectGuid::LowType GetGuildIdInvited() const { return m_GuildIdInvited; } static void RemovePetitionsAndSigns(ObjectGuid guid); // Arena Team void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type); void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value); - static uint32 GetArenaTeamIdFromCharacterInfo(ObjectGuid guid, uint8 slot); static void LeaveAllArenaTeams(ObjectGuid guid); uint32 GetArenaTeamId(uint8 /*slot*/) const { return 0; } uint32 GetArenaPersonalRating(uint8 slot) const { return m_activePlayerData->PvpInfo[slot].Rating; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index df5ac7816af..a454777ba77 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -23,6 +23,7 @@ #include "BattlegroundPackets.h" #include "BattlegroundScore.h" #include "CellImpl.h" +#include "CharacterCache.h" #include "ChatPackets.h" #include "ChatTextBuilder.h" #include "CombatLogPackets.h" @@ -9517,7 +9518,7 @@ void Unit::SetLevel(uint8 lvl) if (player->GetGroup()) player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_LEVEL); - sWorld->UpdateCharacterInfoLevel(GetGUID(), lvl); + sCharacterCache->UpdateCharacterLevel(GetGUID(), lvl); } } diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index c9d4a610047..f4f0554c436 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -258,11 +258,6 @@ Player* ObjectAccessor::FindPlayer(ObjectGuid const& guid) return player && player->IsInWorld() ? player : nullptr; } -Player* ObjectAccessor::FindConnectedPlayer(ObjectGuid const& guid) -{ - return HashMapHolder<Player>::Find(guid); -} - Player* ObjectAccessor::FindPlayerByName(std::string const& name) { Player* player = PlayerNameMapHolder::Find(name); @@ -272,6 +267,17 @@ Player* ObjectAccessor::FindPlayerByName(std::string const& name) return player; } +Player* ObjectAccessor::FindPlayerByLowGUID(ObjectGuid::LowType lowguid) +{ + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(lowguid); + return ObjectAccessor::FindPlayer(guid); +} + +Player* ObjectAccessor::FindConnectedPlayer(ObjectGuid const& guid) +{ + return HashMapHolder<Player>::Find(guid); +} + Player* ObjectAccessor::FindConnectedPlayerByName(std::string const& name) { return PlayerNameMapHolder::Find(name); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index dd202e97482..3cc29130b91 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -84,6 +84,7 @@ namespace ObjectAccessor // ACCESS LIKE THAT IS NOT THREAD SAFE TC_GAME_API Player* FindPlayer(ObjectGuid const&); TC_GAME_API Player* FindPlayerByName(std::string const& name); + TC_GAME_API Player* FindPlayerByLowGUID(ObjectGuid::LowType lowguid); // this returns Player even if he is not in world, for example teleporting TC_GAME_API Player* FindConnectedPlayer(ObjectGuid const&); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 3e8d5a1f02f..18c922bbb84 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2541,53 +2541,6 @@ void ObjectMgr::RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectDat } } -bool ObjectMgr::GetPlayerNameByGUID(ObjectGuid const& guid, std::string& name) -{ - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); - if (!characterInfo) - return false; - - name = characterInfo->Name; - return true; -} - -bool ObjectMgr::GetPlayerNameAndClassByGUID(ObjectGuid const& guid, std::string& name, uint8& _class) -{ - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid)) - { - name = characterInfo->Name; - _class = characterInfo->Class; - return true; - } - - return false; -} - -uint32 ObjectMgr::GetPlayerTeamByGUID(ObjectGuid const& guid) -{ - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid)) - return Player::TeamForRace(characterInfo->Race); - - return 0; -} - -uint32 ObjectMgr::GetPlayerAccountIdByGUID(ObjectGuid const& guid) -{ - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid)) - return characterInfo->AccountId; - - return 0; -} - -uint32 ObjectMgr::GetPlayerAccountIdByPlayerName(std::string const& name) -{ - ObjectGuid guid = sWorld->GetCharacterGuidByName(name); - if (!guid.IsEmpty()) - return GetPlayerAccountIdByGUID(guid); - - return 0; -} - uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventoryType, uint32 quality, uint32 itemLevel) { if (itemClass != ITEM_CLASS_ARMOR && itemClass != ITEM_CLASS_WEAPON) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 67188e8028f..ef20c9ffd24 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1009,25 +1009,6 @@ class TC_GAME_API ObjectMgr } CreatureQuestItemMap const* GetCreatureQuestItemMap() const { return &_creatureQuestItemStore; } - /** - * Retrieves the player name by guid. - * - * If the player is online, the name is retrieved immediately otherwise - * a database query is done. - * - * @remark Use sWorld->GetCharacterNameData because it doesn't require a database query when player is offline - * - * @param guid player full guid - * @param name returned name - * - * @return true if player was found, false otherwise - */ - static bool GetPlayerNameByGUID(ObjectGuid const& guid, std::string& name); - static bool GetPlayerNameAndClassByGUID(ObjectGuid const& guid, std::string& name, uint8& _class); - static uint32 GetPlayerTeamByGUID(ObjectGuid const& guid); - static uint32 GetPlayerAccountIdByGUID(ObjectGuid const& guid); - static uint32 GetPlayerAccountIdByPlayerName(std::string const& name); - uint32 GetNearestTaxiNode(float x, float y, float z, uint32 mapid, uint32 team); void GetTaxiPath(uint32 source, uint32 destination, uint32 &path, uint32 &cost); void GetTaxiPath(uint32 source, uint32 destination, std::vector<uint32>& path, uint32& cost); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 8fa7be7dda9..dfd6af051ec 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -19,6 +19,7 @@ #include "Group.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "CharacterCache.h" #include "Common.h" #include "DatabaseEnv.h" #include "DB2Stores.h" @@ -186,7 +187,7 @@ void Group::LoadGroupFromDB(Field* fields) m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); // group leader not exist - if (!ObjectMgr::GetPlayerNameByGUID(m_leaderGuid, m_leaderName)) + if (!sCharacterCache->GetCharacterNameByGuid(m_leaderGuid, m_leaderName)) return; m_lootMethod = LootMethod(fields[1].GetUInt8()); @@ -216,7 +217,7 @@ void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uin member.guid = ObjectGuid::Create<HighGuid::Player>(guidLow); // skip non-existed member - if (!ObjectMgr::GetPlayerNameAndClassByGUID(member.guid, member.name, member._class)) + if (!sCharacterCache->GetCharacterNameAndClassByGUID(member.guid, member.name, member._class)) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER); stmt->setUInt64(0, guidLow); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 96618d225d3..033a8aa06cd 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -21,6 +21,7 @@ #include "Bag.h" #include "CalendarMgr.h" #include "CalendarPackets.h" +#include "CharacterCache.h" #include "Chat.h" #include "ChatPackets.h" #include "Config.h" @@ -1734,7 +1735,7 @@ void Guild::HandleAcceptMember(WorldSession* session) { Player* player = session->GetPlayer(); if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && - player->GetTeam() != ObjectMgr::GetPlayerTeamByGUID(GetLeaderGUID())) + player->GetTeam() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID())) return; SQLTransaction trans(nullptr); @@ -2374,7 +2375,7 @@ bool Guild::LoadMemberFromDB(Field* fields) return false; } - sWorld->UpdateCharacterGuildId(playerGuid, GetId()); + sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId()); m_members[member->GetGUID()] = member; return true; } @@ -2623,7 +2624,7 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max } Member* member = itr->second; - uint32 level = Player::GetLevelFromCharacterInfo(member->GetGUID()); + uint32 level = sCharacterCache->GetCharacterLevelByGuid(member->GetGUID()); if (member->GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member->IsRankNotLower(minRank)) packet.Invites.emplace_back(member->GetGUID(), level); @@ -2642,7 +2643,7 @@ bool Guild::AddMember(SQLTransaction& trans, ObjectGuid guid, uint8 rankId) if (player->GetGuildId()) return false; } - else if (Player::GetGuildIdFromCharacterInfo(guid)) + else if (sCharacterCache->GetCharacterGuildIdByGuid(guid)) return false; // Remove all player signs from another petitions @@ -2697,7 +2698,7 @@ bool Guild::AddMember(SQLTransaction& trans, ObjectGuid guid, uint8 rankId) return false; } m_members[guid] = member; - sWorld->UpdateCharacterGuildId(guid, GetId()); + sCharacterCache->UpdateCharacterGuildId(guid, GetId()); } member->SaveToDB(trans); @@ -2771,7 +2772,7 @@ void Guild::DeleteMember(SQLTransaction& trans, ObjectGuid guid, bool isDisbandi player->RemoveSpell(entry->SpellID, false, false); } else - sWorld->UpdateCharacterGuildId(guid, 0); + sCharacterCache->UpdateCharacterGuildId(guid, 0); Guild::_DeleteMemberFromDB(trans, guid.GetCounter()); if (!isDisbanding) diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 4a9ae8f74bc..6c29619d38b 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -20,6 +20,7 @@ #include "AccountMgr.h" #include "AuctionHouseMgr.h" #include "AuctionHousePackets.h" +#include "CharacterCache.h" #include "Creature.h" #include "DatabaseEnv.h" #include "Item.h" @@ -394,7 +395,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac // impossible have online own another character (use this for speedup check in case online owner) ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* auction_owner = ObjectAccessor::FindPlayer(ownerGuid); - if (!auction_owner && ObjectMgr::GetPlayerAccountIdByGUID(ownerGuid) == player->GetSession()->GetAccountId()) + if (!auction_owner && sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid) == player->GetSession()->GetAccountId()) { //you cannot bid your another character auction: SendAuctionCommandResult(NULL, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index cbc8de2b294..727733e33b3 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -38,6 +38,7 @@ Copied events should probably have a new owner #include "WorldSession.h" #include "CalendarMgr.h" #include "CalendarPackets.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Guild.h" #include "GuildMgr.h" @@ -259,10 +260,10 @@ void WorldSession::HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEve else { // Invitee offline, get data from storage - ObjectGuid guid = sWorld->GetCharacterGuidByName(calendarEventInvite.Name); + ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(calendarEventInvite.Name); if (!guid.IsEmpty()) { - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid)) + if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid)) { inviteeGuid = guid; inviteeTeam = Player::TeamForRace(characterInfo->Race); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b994e827e1a..21e3ae3f392 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -26,6 +26,7 @@ #include "BattlegroundPackets.h" #include "BattlePetPackets.h" #include "CalendarMgr.h" +#include "CharacterCache.h" #include "CharacterPackets.h" #include "Chat.h" #include "ClientConfigPackets.h" @@ -333,8 +334,8 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (!(charInfo.Flags & (CHARACTER_FLAG_LOCKED_FOR_TRANSFER | CHARACTER_FLAG_LOCKED_BY_BILLING))) _legitCharacters.insert(charInfo.Guid); - if (!sWorld->HasCharacterInfo(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. - sWorld->AddCharacterInfo(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level, false); + if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. + sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level, false); if (charInfo.Class == CLASS_DEMON_HUNTER) demonHunterCount++; @@ -399,8 +400,8 @@ void WorldSession::HandleCharUndeleteEnum(PreparedQueryResult result) TC_LOG_INFO("network", "Loading undeleted char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); - if (!sWorld->HasCharacterInfo(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. - sWorld->AddCharacterInfo(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level, true); + if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. + sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level, true); charEnum.Characters.emplace_back(charInfo); } @@ -738,7 +739,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Create Character: %s %s", GetAccountId(), GetRemoteAddress().c_str(), createInfo->Name.c_str(), newChar.GetGUID().ToString().c_str()); sScriptMgr->OnPlayerCreate(&newChar); - sWorld->AddCharacterInfo(newChar.GetGUID(), GetAccountId(), newChar.GetName(), newChar.m_playerData->NativeSex, newChar.getRace(), newChar.getClass(), newChar.getLevel(), false); + sCharacterCache->AddCharacterCacheEntry(newChar.GetGUID(), GetAccountId(), newChar.GetName(), newChar.m_playerData->NativeSex, newChar.getRace(), newChar.getClass(), newChar.getLevel(), false); newChar.CleanupsBeforeDelete(); }; @@ -784,7 +785,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPackets::Character::CharDelete& c return; } - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(charDelete.Guid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(charDelete.Guid); if (!characterInfo) { sScriptMgr->OnPlayerFailedDelete(charDelete.Guid, initAccountId); @@ -1323,15 +1324,14 @@ void WorldSession::HandleCharRenameCallBack(std::shared_ptr<WorldPackets::Charac SendCharRename(RESPONSE_SUCCESS, renameInfo.get()); - sWorld->UpdateCharacterInfo(renameInfo->Guid, renameInfo->NewName); - sWorld->UpdateCharacterGuidByName(renameInfo->Guid, oldName, renameInfo->NewName); + sCharacterCache->UpdateCharacterData(renameInfo->Guid, renameInfo->NewName); } void WorldSession::HandleSetPlayerDeclinedNames(WorldPackets::Character::SetPlayerDeclinedNames& packet) { // not accept declined names for unsupported languages std::string name; - if (!ObjectMgr::GetPlayerNameByGUID(packet.Player, name)) + if (!sCharacterCache->GetCharacterNameByGuid(packet.Player, name)) { SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, packet.Player); return; @@ -1549,7 +1549,7 @@ void WorldSession::HandleCharCustomizeCallback(std::shared_ptr<WorldPackets::Cha // character with this name already exist /// @todo: make async - ObjectGuid newGuid = sWorld->GetCharacterGuidByName(customizeInfo->CharName); + ObjectGuid newGuid = sCharacterCache->GetCharacterGuidByName(customizeInfo->CharName); if (!newGuid.IsEmpty()) { if (newGuid != customizeInfo->CharGUID) @@ -1599,8 +1599,7 @@ void WorldSession::HandleCharCustomizeCallback(std::shared_ptr<WorldPackets::Cha CharacterDatabase.CommitTransaction(trans); - sWorld->UpdateCharacterInfo(customizeInfo->CharGUID, customizeInfo->CharName, customizeInfo->SexID); - sWorld->UpdateCharacterGuidByName(customizeInfo->CharGUID, oldName, customizeInfo->CharName); + sCharacterCache->UpdateCharacterData(customizeInfo->CharGUID, customizeInfo->CharName, &customizeInfo->SexID); SendCharCustomize(RESPONSE_SUCCESS, customizeInfo.get()); @@ -1783,7 +1782,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa } // get the players old (at this moment current) race - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(factionChangeInfo->Guid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(factionChangeInfo->Guid); if (!characterInfo) { SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo.get()); @@ -1864,7 +1863,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa } // character with this name already exist - ObjectGuid newGuid = sWorld->GetCharacterGuidByName(factionChangeInfo->Name); + ObjectGuid newGuid = sCharacterCache->GetCharacterGuidByName(factionChangeInfo->Name); if (!newGuid.IsEmpty()) { if (newGuid != factionChangeInfo->Guid) @@ -1932,8 +1931,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa trans->Append(stmt); } - sWorld->UpdateCharacterInfo(factionChangeInfo->Guid, factionChangeInfo->Name, factionChangeInfo->SexID, factionChangeInfo->RaceID); - sWorld->UpdateCharacterGuidByName(factionChangeInfo->Guid, oldName, factionChangeInfo->Name); + sCharacterCache->UpdateCharacterData(factionChangeInfo->Guid, factionChangeInfo->Name, &factionChangeInfo->SexID, &factionChangeInfo->RaceID); if (oldRace != factionChangeInfo->RaceID) { @@ -2468,7 +2466,7 @@ void WorldSession::HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCha stmt->setUInt32(0, GetBattlenetAccountId()); LoginDatabase.Execute(stmt); - sWorld->UpdateCharacterInfoDeleted(undeleteInfo->CharacterGuid, false, &undeleteInfo->Name); + sCharacterCache->UpdateCharacterInfoDeleted(undeleteInfo->CharacterGuid, false, &undeleteInfo->Name); SendUndeleteCharacterResponse(CHARACTER_UNDELETE_RESULT_OK, undeleteInfo.get()); })); diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp index 47170cb5d4a..53a36c7c126 100644 --- a/src/server/game/Handlers/GuildFinderHandler.cpp +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -15,6 +15,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "CharacterCache.h" #include "WorldSession.h" #include "Guild.h" #include "GuildFinderMgr.h" @@ -182,7 +183,7 @@ void WorldSession::HandleGuildFinderGetRecruits(WorldPackets::GuildFinder::LFGui recruitData.Availability = recruitRequestPair.second.GetAvailability(); recruitData.SecondsSinceCreated = now - recruitRequestPair.second.GetSubmitTime(); recruitData.SecondsUntilExpiration = recruitRequestPair.second.GetExpiryTime() - now; - if (CharacterInfo const* charInfo = sWorld->GetCharacterInfo(recruitRequestPair.first)) + if (CharacterCacheEntry const* charInfo = sCharacterCache->GetCharacterCacheByGuid(recruitRequestPair.first)) { recruitData.Name = charInfo->Name; recruitData.CharacterClass = charInfo->Class; diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 2074d150dc3..54a84e9e66a 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -15,6 +15,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "CharacterCache.h" #include "DB2Stores.h" #include "WorldSession.h" #include "Group.h" @@ -313,7 +314,7 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) { // Leader info MUST be sent 1st :S uint8 roles = roleCheck.roles.find(roleCheck.leader)->second; - lfgRoleCheckUpdate.Members.emplace_back(roleCheck.leader, roles, ASSERT_NOTNULL(sWorld->GetCharacterInfo(roleCheck.leader))->Level, roles > 0); + lfgRoleCheckUpdate.Members.emplace_back(roleCheck.leader, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(roleCheck.leader))->Level, roles > 0); for (lfg::LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it) { @@ -321,7 +322,7 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) continue; roles = it->second; - lfgRoleCheckUpdate.Members.emplace_back(it->first, roles, ASSERT_NOTNULL(sWorld->GetCharacterInfo(it->first))->Level, roles > 0); + lfgRoleCheckUpdate.Members.emplace_back(it->first, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(it->first))->Level, roles > 0); } } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index bf4b8f790c4..9917164a039 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -18,6 +18,7 @@ #include "WorldSession.h" #include "AccountMgr.h" #include "BattlenetAccountMgr.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "DB2Stores.h" #include "GossipDef.h" @@ -85,7 +86,7 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& packet) ObjectGuid receiverGuid; if (normalizePlayerName(packet.Info.Target)) - receiverGuid = sWorld->GetCharacterGuidByName(packet.Info.Target); + receiverGuid = sCharacterCache->GetCharacterGuidByName(packet.Info.Target); if (!receiverGuid) { @@ -159,7 +160,7 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& packet) } else { - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(receiverGuid)) + if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(receiverGuid)) { receiverTeam = Player::TeamForRace(characterInfo->Race); receiverLevel = characterInfo->Level; @@ -485,16 +486,16 @@ void WorldSession::HandleMailTakeItem(WorldPackets::Mail::MailTakeItem& packet) else { // can be calculated early - sender_accId = ObjectMgr::GetPlayerAccountIdByGUID(sender_guid); + sender_accId = sCharacterCache->GetCharacterAccountIdByGuid(sender_guid); - if (!ObjectMgr::GetPlayerNameByGUID(sender_guid, sender_name)) + if (!sCharacterCache->GetCharacterNameByGuid(sender_guid, sender_name)) sender_name = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); } sLog->outCommand(GetAccountId(), "GM %s (Account: %u) receiver mail item: %s (Entry: %u Count: %u) and send COD money: " UI64FMTD " to player: %s (Account: %u)", GetPlayerName().c_str(), GetAccountId(), it->GetTemplate()->GetDefaultLocaleName(), it->GetEntry(), it->GetCount(), m->COD, sender_name.c_str(), sender_accId); } else if (!receiver) - sender_accId = ObjectMgr::GetPlayerAccountIdByGUID(sender_guid); + sender_accId = sCharacterCache->GetCharacterAccountIdByGuid(sender_guid); // check player existence if (receiver || sender_accId) diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index a4a4d2e7aae..3b08f1bad4e 100644 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -18,6 +18,7 @@ #include "WorldSession.h" #include "Common.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Guild.h" #include "GuildMgr.h" @@ -159,7 +160,7 @@ void WorldSession::HandlePetitionShowSignatures(WorldPackets::Petition::Petition WorldPackets::Petition::ServerPetitionShowSignatures signaturesPacket; signaturesPacket.Item = packet.Item; signaturesPacket.Owner = _player->GetGUID(); - signaturesPacket.OwnerAccountID = ObjectGuid::Create<HighGuid::WowAccount>(ObjectMgr::GetPlayerAccountIdByGUID(_player->GetGUID())); + signaturesPacket.OwnerAccountID = ObjectGuid::Create<HighGuid::WowAccount>(sCharacterCache->GetCharacterAccountIdByGuid(_player->GetGUID())); signaturesPacket.PetitionID = int32(packet.Item.GetCounter()); // @todo verify that... signaturesPacket.Signatures.reserve(signs); @@ -288,7 +289,7 @@ void WorldSession::HandleSignPetition(WorldPackets::Petition::SignPetition& pack return; // not let enemies sign guild charter - if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != ObjectMgr::GetPlayerTeamByGUID(ownerGuid)) + if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != sCharacterCache->GetCharacterTeamByGuid(ownerGuid)) { Guild::SendCommandResult(this, GUILD_COMMAND_CREATE_GUILD, ERR_GUILD_NOT_ALLIED); return; diff --git a/src/server/game/Handlers/SocialHandler.cpp b/src/server/game/Handlers/SocialHandler.cpp index feb498b6312..0c92053d5cf 100644 --- a/src/server/game/Handlers/SocialHandler.cpp +++ b/src/server/game/Handlers/SocialHandler.cpp @@ -17,6 +17,7 @@ #include "WorldSession.h" #include "AccountMgr.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Log.h" #include "ObjectAccessor.h" @@ -43,10 +44,10 @@ void WorldSession::HandleAddFriendOpcode(WorldPackets::Social::AddFriend& packet GetPlayerInfo().c_str(), packet.Name.c_str()); FriendsResult friendResult = FRIEND_NOT_FOUND; - ObjectGuid friendGuid = sWorld->GetCharacterGuidByName(packet.Name); + ObjectGuid friendGuid = sCharacterCache->GetCharacterGuidByName(packet.Name); if (!friendGuid.IsEmpty()) { - if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(friendGuid)) + if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(friendGuid)) { uint32 team = Player::TeamForRace(characterInfo->Race); uint32 friendAccountId = characterInfo->AccountId; @@ -97,7 +98,7 @@ void WorldSession::HandleAddIgnoreOpcode(WorldPackets::Social::AddIgnore& packet TC_LOG_DEBUG("network", "WorldSession::HandleAddIgnoreOpcode: %s asked to Ignore: %s", GetPlayer()->GetName().c_str(), packet.Name.c_str()); - ObjectGuid ignoreGuid = sWorld->GetCharacterGuidByName(packet.Name); + ObjectGuid ignoreGuid = sCharacterCache->GetCharacterGuidByName(packet.Name); FriendsResult ignoreResult = FRIEND_IGNORE_NOT_FOUND; if (!ignoreGuid.IsEmpty()) { diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index 8ee5abe3a15..a632ba37622 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -20,6 +20,7 @@ #include "AuctionHouseMgr.h" #include "BlackMarketMgr.h" #include "CalendarMgr.h" +#include "CharacterCache.h" #include "DatabaseEnv.h" #include "Item.h" #include "Log.h" @@ -147,7 +148,7 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, ObjectGuid::LowType sender uint32 rc_account = 0; if (!receiver) - rc_account = ObjectMgr::GetPlayerAccountIdByGUID(receiverGuid); + rc_account = sCharacterCache->GetCharacterAccountIdByGuid(receiverGuid); if (!receiver && !rc_account) // sender not exist { diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 8c4ba6f1746..6433b62d2ea 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -17,6 +17,7 @@ #include "QueryPackets.h" #include "BattlenetAccountMgr.h" +#include "CharacterCache.h" #include "ObjectMgr.h" #include "Player.h" #include "World.h" @@ -121,7 +122,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupHi bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& guid, Player const* player /*= nullptr*/) { - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid); if (!characterInfo) return false; @@ -142,7 +143,7 @@ bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& gui } else { - uint32 accountId = ObjectMgr::GetPlayerAccountIdByGUID(guid); + uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid); uint32 bnetAccountId = ::Battlenet::AccountMgr::GetIdByGameAccount(accountId); AccountID = ObjectGuid::Create<HighGuid::WowAccount>(accountId); diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 25ed7d1aa77..380bf02b14d 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -16,6 +16,7 @@ */ #include "SupportMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "Language.h" @@ -47,7 +48,7 @@ std::string Ticket::GetPlayerName() const { std::string name; if (!_playerGuid.IsEmpty()) - ObjectMgr::GetPlayerNameByGUID(_playerGuid, name); + sCharacterCache->GetCharacterNameByGuid(_playerGuid, name); return name; } @@ -61,7 +62,7 @@ std::string Ticket::GetAssignedToName() const { std::string name; if (!_assignedTo.IsEmpty()) - ObjectMgr::GetPlayerNameByGUID(_assignedTo, name); + sCharacterCache->GetCharacterNameByGuid(_assignedTo, name); return name; } diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 7bb52a2e453..86d50a745e1 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -18,6 +18,7 @@ #include "PlayerDump.h" #include "AccountMgr.h" +#include "CharacterCache.h" #include "Common.h" #include "DatabaseEnv.h" #include "Log.h" @@ -754,7 +755,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::string const& file, uint32 account, s CharacterDatabase.CommitTransaction(trans); // in case of name conflict player has to rename at login anyway - sWorld->AddCharacterInfo(ObjectGuid::Create<HighGuid::Player>(guid), account, name, gender, race, playerClass, level, false); + sCharacterCache->AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(guid), account, name, gender, race, playerClass, level, false); sObjectMgr->GetGenerator<HighGuid::Item>().Set(sObjectMgr->GetGenerator<HighGuid::Item>().GetNextAfterMaxUsed() + items.size()); sObjectMgr->_mailId += mails.size(); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 8fc886efe9d..839845c010a 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -35,6 +35,7 @@ #include "BlackMarketMgr.h" #include "CalendarMgr.h" #include "Channel.h" +#include "CharacterCache.h" #include "CharacterDatabaseCleaner.h" #include "CharacterTemplateDataStore.h" #include "Chat.h" @@ -1940,8 +1941,8 @@ void World::SetInitialWorldSettings() } // Load before guilds and arena teams - TC_LOG_INFO("server.loading", "Loading character info store..."); - LoadCharacterInfoStore(); + TC_LOG_INFO("server.loading", "Loading character cache store..."); + sCharacterCache->LoadCharacterCacheStorage(); TC_LOG_INFO("server.loading", "Loading Guild rewards..."); sGuildMgr->LoadGuildRewards(); @@ -2839,7 +2840,7 @@ bool World::RemoveBanAccount(BanMode mode, std::string const& nameOrIP) if (mode == BAN_ACCOUNT) account = AccountMgr::GetId(nameOrIP); else if (mode == BAN_CHARACTER) - account = ObjectMgr::GetPlayerAccountIdByPlayerName(nameOrIP); + account = sCharacterCache->GetCharacterAccountIdByName(nameOrIP); if (!account) return false; @@ -2863,7 +2864,7 @@ BanReturn World::BanCharacter(std::string const& name, std::string const& durati /// Pick a player to ban if not online if (!banned) { - guid = sWorld->GetCharacterGuidByName(name); + guid = sCharacterCache->GetCharacterGuidByName(name); if (guid.IsEmpty()) return BAN_NOTFOUND; // Nobody to ban } @@ -2900,7 +2901,7 @@ bool World::RemoveBanCharacter(std::string const& name) /// Pick a player to ban if not online if (!banned) { - guid = sWorld->GetCharacterGuidByName(name); + guid = sCharacterCache->GetCharacterGuidByName(name); if (guid.IsEmpty()) return false; // Nobody to ban } @@ -3536,164 +3537,6 @@ void World::ProcessQueryCallbacks() _queryProcessor.ProcessReadyQueries(); } -ObjectGuid World::GetCharacterGuidByName(std::string const& name) const -{ - auto itr = _characterGuidByNameStore.find(name); - if (itr != _characterGuidByNameStore.end()) - return itr->second; - - return ObjectGuid::Empty; -} - -/** - * @brief Loads several pieces of information on server startup with the GUID - * There is no further database query necessary. - * These are a number of methods that work into the calling function. - * - * @param guid Requires a guid to call - * @return Name, Sex, Race, Class and Level of player character - * Example Usage: - * @code - * CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(GUID); - * if (!nameData) - * return; - * - * std::string playerName = characterInfo->Name; - * uint8 playerGender = characterInfo->Sex; - * uint8 playerRace = characterInfo->Race; - * uint8 playerClass = characterInfo->Class; - * uint8 playerLevel = characterInfo->Level; - * @endcode - */ - -CharacterInfo const* World::GetCharacterInfo(ObjectGuid const& guid) const -{ - CharacterInfoContainer::const_iterator itr = _characterInfoStore.find(guid); - if (itr != _characterInfoStore.end()) - return &itr->second; - - return nullptr; -} - -void World::LoadCharacterInfoStore() -{ - _characterInfoStore.clear(); - - QueryResult result = CharacterDatabase.Query("SELECT guid, name, account, race, gender, class, level, deleteDate FROM characters"); - if (!result) - { - TC_LOG_INFO("server.loading", "No character name data loaded, empty query"); - return; - } - - do - { - Field* fields = result->Fetch(); - AddCharacterInfo(ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()), fields[2].GetUInt32(), fields[1].GetString(), - fields[4].GetUInt8() /*gender*/, fields[3].GetUInt8() /*race*/, fields[5].GetUInt8() /*class*/, fields[6].GetUInt8() /*level*/, fields[7].GetUInt32() != 0); - } - while (result->NextRow()); - - TC_LOG_INFO("server.loading", "Loaded character infos for " SZFMTD " characters", _characterInfoStore.size()); -} - -void World::AddCharacterInfo(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, bool isDeleted) -{ - CharacterInfo& data = _characterInfoStore[guid]; - data.Name = name; - data.AccountId = accountId; - data.Race = race; - data.Sex = gender; - data.Class = playerClass; - data.Level = level; - data.GuildId = 0; // Will be set in guild loading or guild setting - for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i) - data.ArenaTeamId[i] = 0; // Will be set in arena teams loading - data.IsDeleted = isDeleted; - - // Fill Name to Guid Store - _characterGuidByNameStore[name] = guid; -} - -void World::DeleteCharacterInfo(ObjectGuid const& guid, std::string const& name) -{ - _characterInfoStore.erase(guid); - _characterGuidByNameStore.erase(name); -} - -void World::UpdateCharacterInfo(ObjectGuid const& guid, std::string const& name, uint8 gender /*= GENDER_NONE*/, uint8 race /*= RACE_NONE*/) -{ - CharacterInfoContainer::iterator itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.Name = name; - - if (gender != GENDER_NONE) - itr->second.Sex = gender; - - if (race != RACE_NONE) - itr->second.Race = race; - - WorldPackets::Misc::InvalidatePlayer data; - data.Guid = guid; - SendGlobalMessage(data.Write()); -} - -void World::UpdateCharacterInfoLevel(ObjectGuid const& guid, uint8 level) -{ - CharacterInfoContainer::iterator itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.Level = level; -} - -void World::UpdateCharacterInfoAccount(ObjectGuid const& guid, uint32 accountId) -{ - auto itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.AccountId = accountId; -} - -void World::UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId) -{ - auto itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.GuildId = guildId; -} - -void World::UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId) -{ - auto itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.ArenaTeamId[slot] = arenaTeamId; -} - -void World::UpdateCharacterGuidByName(ObjectGuid const& guid, std::string const& oldName, std::string const& newName) -{ - _characterGuidByNameStore.erase(oldName); - _characterGuidByNameStore[newName] = guid; -} - -void World::UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name /*= nullptr*/) -{ - CharacterInfoContainer::iterator itr = _characterInfoStore.find(guid); - if (itr == _characterInfoStore.end()) - return; - - itr->second.IsDeleted = deleted; - - if (name) - itr->second.Name = *name; -} - void World::ReloadRBAC() { // Passive reload, we mark the data as invalidated and next time a permission is checked it will be reloaded diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 9715cff322f..fe8255ddd33 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -569,19 +569,6 @@ private: typedef std::unordered_map<uint32, WorldSession*> SessionMap; -struct CharacterInfo -{ - std::string Name; - uint32 AccountId; - uint8 Class; - uint8 Race; - uint8 Sex; - uint8 Level; - ObjectGuid::LowType GuildId; - uint32 ArenaTeamId[3]; - bool IsDeleted; -}; - /// The World class TC_GAME_API World { @@ -801,19 +788,6 @@ class TC_GAME_API World void UpdateAreaDependentAuras(); - CharacterInfo const* GetCharacterInfo(ObjectGuid const& guid) const; - ObjectGuid GetCharacterGuidByName(std::string const& name) const; - void AddCharacterInfo(ObjectGuid const& guid, uint32 accountId, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level, bool isDeleted); - void DeleteCharacterInfo(ObjectGuid const& guid, std::string const& name); - bool HasCharacterInfo(ObjectGuid const& guid) { return _characterInfoStore.find(guid) != _characterInfoStore.end(); } - void UpdateCharacterInfo(ObjectGuid const& guid, std::string const& name, uint8 gender = GENDER_NONE, uint8 race = RACE_NONE); - void UpdateCharacterInfoLevel(ObjectGuid const& guid, uint8 level); - void UpdateCharacterInfoAccount(ObjectGuid const& guid, uint32 accountId); - void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); - void UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId); - void UpdateCharacterGuidByName(ObjectGuid const& guid, std::string const& oldName, std::string const& newName); - void UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name = nullptr); - uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } void ResetEventSeasonalQuests(uint16 event_id); @@ -928,12 +902,6 @@ class TC_GAME_API World typedef std::unordered_map<uint8, Autobroadcast> AutobroadcastContainer; AutobroadcastContainer m_Autobroadcasts; - typedef std::unordered_map<std::string, ObjectGuid> CharacterGuidByNameContainer; - typedef std::map<ObjectGuid, CharacterInfo> CharacterInfoContainer; - CharacterInfoContainer _characterInfoStore; - CharacterGuidByNameContainer _characterGuidByNameStore; - void LoadCharacterInfoStore(); - void ProcessQueryCallbacks(); QueryCallbackProcessor _queryProcessor; }; diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp index 837bcc8462e..c238510474d 100644 --- a/src/server/scripts/Commands/cs_arena.cpp +++ b/src/server/scripts/Commands/cs_arena.cpp @@ -24,6 +24,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ArenaTeamMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "Language.h" #include "Log.h" @@ -86,7 +87,7 @@ public: if (type == 2 || type == 3 || type == 5 ) { - if (Player::GetArenaTeamIdFromCharacterInfo(target->GetGUID(), type) != 0) + if (sCharacterCache->GetCharacterArenaTeamIdByGuid(target->GetGUID(), type) != 0) { handler->PSendSysMessage(LANG_ARENA_ERROR_SIZE, target->GetName().c_str()); handler->SetSentErrorMessage(true); @@ -277,7 +278,7 @@ public: arena->SetCaptain(targetGuid); std::string oldCaptainName; - if (!ObjectMgr::GetPlayerNameByGUID(arena->GetCaptain(), oldCaptainName)) + if (!sCharacterCache->GetCharacterNameByGuid(arena->GetCaptain(), oldCaptainName)) { handler->SetSentErrorMessage(true); return false; diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 11d7002452d..6ecd3072298 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -23,6 +23,7 @@ Category: commandscripts EndScriptData */ #include "AccountMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "Language.h" @@ -313,7 +314,7 @@ public: if (!target) { - targetGuid = sWorld->GetCharacterGuidByName(name); + targetGuid = sCharacterCache->GetCharacterGuidByName(name); if (targetGuid.IsEmpty()) { handler->SendSysMessage(LANG_BANINFO_NOCHARACTER); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index d7305193ff5..800d5b4a4af 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -23,6 +23,7 @@ Category: commandscripts EndScriptData */ #include "AccountMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "DB2Stores.h" @@ -214,7 +215,7 @@ public: return; } - if (!sWorld->GetCharacterGuidByName(delInfo.name).IsEmpty()) + if (!sCharacterCache->GetCharacterGuidByName(delInfo.name).IsEmpty()) { handler->PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_NAME, delInfo.name.c_str(), delInfo.guid.ToString().c_str(), delInfo.accountId); return; @@ -226,7 +227,7 @@ public: stmt->setUInt64(2, delInfo.guid.GetCounter()); CharacterDatabase.Execute(stmt); - sWorld->UpdateCharacterInfoDeleted(delInfo.guid, false, &delInfo.name); + sCharacterCache->UpdateCharacterInfoDeleted(delInfo.guid, false, &delInfo.name); } static void HandleCharacterLevel(Player* player, ObjectGuid playerGuid, uint32 oldLevel, uint32 newLevel, ChatHandler* handler) @@ -328,7 +329,7 @@ public: if (handler->HasLowerSecurity(NULL, targetGuid)) return false; - ObjectMgr::GetPlayerNameByGUID(targetGuid, playerOldName); + sCharacterCache->GetCharacterNameByGuid(targetGuid, playerOldName); } if (!normalizePlayerName(newName)) @@ -385,15 +386,14 @@ public: CharacterDatabase.Execute(stmt); } - sWorld->UpdateCharacterInfo(targetGuid, newName); - sWorld->UpdateCharacterGuidByName(targetGuid, playerOldName, newName); + sCharacterCache->UpdateCharacterData(targetGuid, newName); handler->PSendSysMessage(LANG_RENAME_PLAYER_WITH_NEW_NAME, playerOldName.c_str(), newName.c_str()); if (WorldSession* session = handler->GetSession()) { if (Player* player = session->GetPlayer()) - sLog->outCommand(session->GetAccountId(), "GM %s (Account: %u) forced rename %s to player %s (Account: %u)", player->GetName().c_str(), session->GetAccountId(), newName.c_str(), playerOldName.c_str(), ObjectMgr::GetPlayerAccountIdByGUID(targetGuid)); + sLog->outCommand(session->GetAccountId(), "GM %s (Account: %u) forced rename %s to player %s (Account: %u)", player->GetName().c_str(), session->GetAccountId(), newName.c_str(), playerOldName.c_str(), sCharacterCache->GetCharacterAccountIdByGuid(targetGuid)); } else sLog->outCommand(0, "CONSOLE forced rename '%s' to '%s' (%s)", playerOldName.c_str(), newName.c_str(), targetGuid.ToString().c_str()); @@ -449,7 +449,7 @@ public: if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) return false; - int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromCharacterInfo(targetGuid); + int32 oldlevel = target ? target->getLevel() : sCharacterCache->GetCharacterLevelByGuid(targetGuid); int32 newlevel = levelStr ? atoi(levelStr) : oldlevel; if (newlevel < 1) @@ -566,7 +566,7 @@ public: if (!handler->extractPlayerTarget(playerNameStr, nullptr, &targetGuid, &targetName)) return false; - CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(targetGuid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(targetGuid); if (!characterInfo) { handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -618,7 +618,7 @@ public: sWorld->UpdateRealmCharCount(oldAccountId); sWorld->UpdateRealmCharCount(newAccountId); - sWorld->UpdateCharacterInfoAccount(targetGuid, newAccountId); + sCharacterCache->UpdateCharacterAccountId(targetGuid, newAccountId); handler->PSendSysMessage(LANG_CHANGEACCOUNT_SUCCESS, targetName.c_str(), accountName.c_str()); @@ -865,14 +865,14 @@ public: } else { - characterGuid = sWorld->GetCharacterGuidByName(characterName); + characterGuid = sCharacterCache->GetCharacterGuidByName(characterName); if (!characterGuid) { handler->PSendSysMessage(LANG_NO_PLAYER, characterName.c_str()); handler->SetSentErrorMessage(true); return false; } - accountId = ObjectMgr::GetPlayerAccountIdByGUID(characterGuid); + accountId = sCharacterCache->GetCharacterAccountIdByGuid(characterGuid); } std::string accountName; @@ -903,7 +903,7 @@ public: if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) return false; - int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromCharacterInfo(targetGuid); + int32 oldlevel = target ? target->getLevel() : sCharacterCache->GetCharacterLevelByGuid(targetGuid); int32 addlevel = levelStr ? atoi(levelStr) : 1; int32 newlevel = oldlevel + addlevel; @@ -1001,7 +1001,7 @@ public: return false; } - if (ObjectMgr::GetPlayerAccountIdByGUID(ObjectGuid::Create<HighGuid::Player>(guid))) + if (sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid::Create<HighGuid::Player>(guid))) { handler->PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, std::to_string(guid).c_str()); handler->SetSentErrorMessage(true); @@ -1060,10 +1060,10 @@ public: return false; } - guid = sWorld->GetCharacterGuidByName(name); + guid = sCharacterCache->GetCharacterGuidByName(name); } - if (!ObjectMgr::GetPlayerAccountIdByGUID(guid)) + if (!sCharacterCache->GetCharacterAccountIdByGuid(guid)) { handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 4faf55963fe..3300efaafdd 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "DB2Stores.h" @@ -277,7 +278,7 @@ public: ObjectGuid parseGUID = ObjectGuid::Create<HighGuid::Player>(strtoull(args, nullptr, 10)); // ... and try to extract a player out of it. - if (ObjectMgr::GetPlayerNameByGUID(parseGUID, nameTarget)) + if (sCharacterCache->GetCharacterNameByGuid(parseGUID, nameTarget)) { playerTarget = ObjectAccessor::FindPlayer(parseGUID); guidTarget = parseGUID; diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index dccbbec60ac..dcde232edff 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -24,6 +24,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "AchievementMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "Language.h" #include "Guild.h" @@ -162,7 +163,7 @@ public: if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid)) return false; - ObjectGuid::LowType guildId = target ? target->GetGuildId() : Player::GetGuildIdFromCharacterInfo(targetGuid); + ObjectGuid::LowType guildId = target ? target->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(targetGuid); if (!guildId) return false; @@ -189,7 +190,7 @@ public: if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &target_name)) return false; - ObjectGuid::LowType guildId = target ? target->GetGuildId() : Player::GetGuildIdFromCharacterInfo(targetGuid); + ObjectGuid::LowType guildId = target ? target->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(targetGuid); if (!guildId) return false; @@ -272,7 +273,7 @@ public: handler->PSendSysMessage(LANG_GUILD_INFO_NAME, guild->GetName().c_str(), std::to_string(guild->GetId()).c_str()); // Guild Id + Name std::string guildMasterName; - if (ObjectMgr::GetPlayerNameByGUID(guild->GetLeaderGUID(), guildMasterName)) + if (sCharacterCache->GetCharacterNameByGuid(guild->GetLeaderGUID(), guildMasterName)) handler->PSendSysMessage(LANG_GUILD_INFO_GUILD_MASTER, guildMasterName.c_str(), guild->GetLeaderGUID().ToString().c_str()); // Guild Master // Format creation date diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp index c2ea1efd9f9..4ff73e0d61b 100644 --- a/src/server/scripts/Commands/cs_lfg.cpp +++ b/src/server/scripts/Commands/cs_lfg.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "Group.h" @@ -83,7 +84,7 @@ public: ObjectGuid parseGUID = ObjectGuid::Create<HighGuid::Player>(uint64(atoull(args))); - if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget)) + if (sCharacterCache->GetCharacterNameByGuid(parseGUID, nameTarget)) { playerTarget = ObjectAccessor::FindPlayer(parseGUID); guidTarget = parseGUID; diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index fa7f8c27c47..c256fbc6f2e 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -23,6 +23,7 @@ Category: commandscripts EndScriptData */ #include "ScriptMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "Language.h" @@ -479,7 +480,7 @@ public: ObjectGuid parseGUID = ObjectGuid::Create<HighGuid::Player>(strtoull(args, nullptr, 10)); - if (ObjectMgr::GetPlayerNameByGUID(parseGUID, targetName)) + if (sCharacterCache->GetCharacterNameByGuid(parseGUID, targetName)) { target = ObjectAccessor::FindPlayer(parseGUID); targetGuid = parseGUID; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 10cf9398c00..9f8d7148121 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -18,6 +18,7 @@ #include "AccountMgr.h" #include "ArenaTeamMgr.h" #include "CellImpl.h" +#include "CharacterCache.h" #include "Chat.h" #include "DatabaseEnv.h" #include "DB2Stores.h" @@ -1599,7 +1600,7 @@ public: ObjectGuid parseGUID = ObjectGuid::Create<HighGuid::Player>(strtoull(args, nullptr, 10)); // ... and make sure we get a target, somehow. - if (ObjectMgr::GetPlayerNameByGUID(parseGUID, targetName)) + if (sCharacterCache->GetCharacterNameByGuid(parseGUID, targetName)) { target = ObjectAccessor::FindPlayer(parseGUID); targetGuid = parseGUID; @@ -1995,7 +1996,7 @@ public: if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) return false; - uint32 accountId = target ? target->GetSession()->GetAccountId() : ObjectMgr::GetPlayerAccountIdByGUID(targetGuid); + uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(targetGuid); // find only player from same account if any if (!target) @@ -2064,7 +2065,7 @@ public: if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName)) return false; - uint32 accountId = target ? target->GetSession()->GetAccountId() : ObjectMgr::GetPlayerAccountIdByGUID(targetGuid); + uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(targetGuid); // find only player from same account if any if (!target) @@ -2621,7 +2622,7 @@ public: if (targetName) { // Check for offline players - ObjectGuid guid = sWorld->GetCharacterGuidByName(name); + ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(name); if (guid.IsEmpty()) { handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG); diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index e517235dac7..84a1f323b7a 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -23,6 +23,7 @@ Category: commandscripts EndScriptData */ #include "AccountMgr.h" +#include "CharacterCache.h" #include "Chat.h" #include "Config.h" #include "Language.h" @@ -125,8 +126,8 @@ bool ticket_commandscript::HandleTicketAssignToCommand(ChatHandler* handler, cha return true; } - ObjectGuid targetGuid = sWorld->GetCharacterGuidByName(target); - uint32 accountId = ObjectMgr::GetPlayerAccountIdByGUID(targetGuid); + ObjectGuid targetGuid = sCharacterCache->GetCharacterGuidByName(target); + uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(targetGuid); // Target must exist and have administrative rights if (!AccountMgr::HasPermission(accountId, rbac::RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET, realm.Id.Realm)) { @@ -326,7 +327,7 @@ bool ticket_commandscript::HandleTicketUnAssignCommand(ChatHandler* handler, cha else { ObjectGuid guid = ticket->GetAssignedToGUID(); - uint32 accountId = ObjectMgr::GetPlayerAccountIdByGUID(guid); + uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid); security = AccountMgr::GetSecurity(accountId, realm.Id.Realm); } |