aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-02-05 23:14:19 +0100
committerShauren <shauren.trinity@gmail.com>2019-07-21 21:06:54 +0200
commitad4e63bae145ae49b584ab2fc621660430cec0d3 (patch)
tree403c1e9348047f49b80fa719567259c388629318 /src
parent241e79f434bdd520fb11dbc12b93ab41a7b39dd2 (diff)
Core/Misc: Moved CharacterInfo out of world to separate class
Closes #19030 (cherrypicked from 59ce3d6c9bd82d55cbfa505bb945b71cab21a12f)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp21
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp17
-rw-r--r--src/server/game/BlackMarket/BlackMarketMgr.cpp9
-rw-r--r--src/server/game/Cache/CharacterCache.cpp301
-rw-r--r--src/server/game/Cache/CharacterCache.h74
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp9
-rw-r--r--src/server/game/Chat/Channels/ChannelAppenders.h3
-rw-r--r--src/server/game/Chat/Chat.cpp9
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp44
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp3
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp16
-rw-r--r--src/server/game/Globals/ObjectAccessor.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp47
-rw-r--r--src/server/game/Globals/ObjectMgr.h19
-rw-r--r--src/server/game/Groups/Group.cpp5
-rw-r--r--src/server/game/Guilds/Guild.cpp13
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp3
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp5
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp32
-rw-r--r--src/server/game/Handlers/GuildFinderHandler.cpp3
-rw-r--r--src/server/game/Handlers/LFGHandler.cpp5
-rw-r--r--src/server/game/Handlers/MailHandler.cpp11
-rw-r--r--src/server/game/Handlers/PetitionsHandler.cpp5
-rw-r--r--src/server/game/Handlers/SocialHandler.cpp7
-rw-r--r--src/server/game/Mails/Mail.cpp3
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp5
-rw-r--r--src/server/game/Support/SupportMgr.cpp5
-rw-r--r--src/server/game/Tools/PlayerDump.cpp3
-rw-r--r--src/server/game/World/World.cpp169
-rw-r--r--src/server/game/World/World.h32
-rw-r--r--src/server/scripts/Commands/cs_arena.cpp5
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp3
-rw-r--r--src/server/scripts/Commands/cs_character.cpp30
-rw-r--r--src/server/scripts/Commands/cs_group.cpp3
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp7
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp3
-rw-r--r--src/server/scripts/Commands/cs_list.cpp3
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp9
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp7
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);
}