aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-09-09 20:38:04 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-05 19:20:18 +0100
commitb6635be04184cdea0e3ed269cc1687f72c3dc5a9 (patch)
treed66809191630116aed2afb507b9e8949d7366492 /src
parent42be7836dfacd9e8d6b0c2b5d5f230ed6a55f088 (diff)
[3.3.5] Core/Guilds: Guild cleanup (PR #25422)
(cherry picked from commit cd28423a4e813baf6833f38c93613a7f82a721f8)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp14
-rw-r--r--src/server/game/Globals/ObjectMgr.h14
-rw-r--r--src/server/game/Guilds/Guild.cpp513
-rw-r--r--src/server/game/Guilds/Guild.h131
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp16
-rw-r--r--src/server/game/Guilds/GuildMgr.h2
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp2
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h2
-rw-r--r--src/server/game/Server/WorldSession.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h2
10 files changed, 314 insertions, 384 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 45213a1e214..c8334a3dfaf 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -8641,7 +8641,7 @@ void ObjectMgr::LoadReservedPlayersNames()
TC_LOG_INFO("server.loading", ">> Loaded %u reserved player names in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-bool ObjectMgr::IsReservedName(const std::string& name) const
+bool ObjectMgr::IsReservedName(std::string_view name) const
{
std::wstring wstr;
if (!Utf8toWStr (name, wstr))
@@ -8725,7 +8725,7 @@ bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSp
return false;
}
-ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant locale, bool create /*= false*/)
+ResponseCodes ObjectMgr::CheckPlayerName(std::string_view name, LocaleConstant locale, bool create /*= false*/)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
@@ -8750,7 +8750,7 @@ ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant
return sDB2Manager.ValidateName(wname, locale);
}
-bool ObjectMgr::IsValidCharterName(const std::string& name)
+bool ObjectMgr::IsValidCharterName(std::string_view name)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
@@ -8768,7 +8768,7 @@ bool ObjectMgr::IsValidCharterName(const std::string& name)
return isValidString(wname, strictMask, true);
}
-PetNameInvalidReason ObjectMgr::CheckPetName(const std::string& name)
+PetNameInvalidReason ObjectMgr::CheckPetName(std::string_view name)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
@@ -9084,7 +9084,7 @@ void ObjectMgr::LoadGameTele()
TC_LOG_INFO("server.loading", ">> Loaded %u GameTeleports in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-GameTele const* ObjectMgr::GetGameTele(const std::string& name) const
+GameTele const* ObjectMgr::GetGameTele(std::string_view name) const
{
// explicit name case
std::wstring wname;
@@ -9107,7 +9107,7 @@ GameTele const* ObjectMgr::GetGameTele(const std::string& name) const
return alt;
}
-GameTele const* ObjectMgr::GetGameTeleExactName(const std::string& name) const
+GameTele const* ObjectMgr::GetGameTeleExactName(std::string_view name) const
{
// explicit name case
std::wstring wname;
@@ -9159,7 +9159,7 @@ bool ObjectMgr::AddGameTele(GameTele& tele)
return true;
}
-bool ObjectMgr::DeleteGameTele(const std::string& name)
+bool ObjectMgr::DeleteGameTele(std::string_view name)
{
// explicit name case
std::wstring wname;
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index e157a84c539..bef065c7ba2 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1611,12 +1611,12 @@ class TC_GAME_API ObjectMgr
// reserved names
void LoadReservedPlayersNames();
- bool IsReservedName(std::string const& name) const;
+ bool IsReservedName(std::string_view name) const;
// name with valid structure and symbols
- static ResponseCodes CheckPlayerName(std::string const& name, LocaleConstant locale, bool create = false);
- static PetNameInvalidReason CheckPetName(std::string const& name);
- static bool IsValidCharterName(std::string const& name);
+ static ResponseCodes CheckPlayerName(std::string_view name, LocaleConstant locale, bool create = false);
+ static PetNameInvalidReason CheckPetName(std::string_view name);
+ static bool IsValidCharterName(std::string_view name);
static bool CheckDeclinedNames(const std::wstring& w_ownname, DeclinedName const& names);
@@ -1626,11 +1626,11 @@ class TC_GAME_API ObjectMgr
if (itr == _gameTeleStore.end()) return nullptr;
return &itr->second;
}
- GameTele const* GetGameTele(std::string const& name) const;
- GameTele const* GetGameTeleExactName(std::string const& name) const;
+ GameTele const* GetGameTele(std::string_view name) const;
+ GameTele const* GetGameTeleExactName(std::string_view name) const;
GameTeleContainer const& GetGameTeleMap() const { return _gameTeleStore; }
bool AddGameTele(GameTele& data);
- bool DeleteGameTele(std::string const& name);
+ bool DeleteGameTele(std::string_view name);
Trainer::Trainer const* GetTrainer(uint32 trainerId) const;
uint32 GetCreatureDefaultTrainer(uint32 creatureId) const
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index eb7ce272537..ae1d80796cb 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -53,7 +53,7 @@ inline uint64 GetGuildBankTabPrice(uint8 tabId)
return tabPrices[tabId];
}
-void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param)
+void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param)
{
WorldPackets::Guild::GuildCommandResult resultPacket;
resultPacket.Command = type;
@@ -62,7 +62,7 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
session->SendPacket(resultPacket.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_COMMAND_RESULT [%s]: Type: %u, code: %u, param: %s"
- , session->GetPlayerInfo().c_str(), type, errCode, param.c_str());
+ , session->GetPlayerInfo().c_str(), type, errCode, resultPacket.Name.c_str());
}
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
@@ -75,39 +75,35 @@ void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode
}
// LogHolder
-Guild::LogHolder::~LogHolder()
-{
- // Cleanup
- for (auto itr = m_log.begin(); itr != m_log.end(); ++itr)
- delete (*itr);
-}
+template <typename Entry>
+Guild::LogHolder<Entry>::LogHolder()
+ : m_maxRecords(sWorld->getIntConfig(std::is_same_v<Entry, BankEventLogEntry> ? CONFIG_GUILD_BANK_EVENT_LOG_COUNT : CONFIG_GUILD_EVENT_LOG_COUNT)), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED))
+{ }
-// Adds event loaded from database to collection
-inline void Guild::LogHolder::LoadEvent(LogEntry* entry)
+template <typename Entry> template <typename... Ts>
+void Guild::LogHolder<Entry>::LoadEvent(Ts&&... args)
{
+ Entry const& newEntry = m_log.emplace_front(std::forward<Ts>(args)...);
if (m_nextGUID == uint32(GUILD_EVENT_LOG_GUID_UNDEFINED))
- m_nextGUID = entry->GetGUID();
- m_log.push_front(entry);
+ m_nextGUID = newEntry.GetGUID();
}
-// Adds new event happened in game.
-// If maximum number of events is reached, oldest event is removed from collection.
-inline void Guild::LogHolder::AddEvent(CharacterDatabaseTransaction& trans, LogEntry* entry)
+template <typename Entry> template <typename... Ts>
+Entry& Guild::LogHolder<Entry>::AddEvent(CharacterDatabaseTransaction trans, Ts&&... args)
{
// Check max records limit
- if (m_log.size() >= m_maxRecords)
- {
- LogEntry* oldEntry = m_log.front();
- delete oldEntry;
+ if (!CanInsert())
m_log.pop_front();
- }
+
// Add event to list
- m_log.push_back(entry);
+ Entry& entry = m_log.emplace_back(std::forward<Ts>(args)...);
// Save to DB
- entry->SaveToDB(trans);
+ entry.SaveToDB(trans);
+ return entry;
}
-inline uint32 Guild::LogHolder::GetNextGUID()
+template <typename Entry>
+inline uint32 Guild::LogHolder<Entry>::GetNextGUID()
{
// Next guid was not initialized. It means there are no records for this holder in DB yet.
// Start from the beginning.
@@ -297,7 +293,7 @@ void Guild::RankInfo::CreateMissingTabsIfNeeded(uint8 tabs, CharacterDatabaseTra
}
}
-void Guild::RankInfo::SetName(std::string const& name)
+void Guild::RankInfo::SetName(std::string_view name)
{
if (m_name == name)
return;
@@ -364,9 +360,7 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAnd
// BankTab
Guild::BankTab::BankTab(ObjectGuid::LowType guildId, uint8 tabId) : m_guildId(guildId), m_tabId(tabId)
-{
- memset(m_items, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*));
-}
+{ }
void Guild::BankTab::LoadFromDB(Field* fields)
{
@@ -429,9 +423,9 @@ void Guild::BankTab::Delete(CharacterDatabaseTransaction& trans, bool removeItem
}
}
-void Guild::BankTab::SetInfo(std::string const& name, std::string const& icon)
+void Guild::BankTab::SetInfo(std::string_view name, std::string_view icon)
{
- if (m_name == name && m_icon == icon)
+ if ((m_name == name) && (m_icon == icon))
return;
m_name = name;
@@ -445,7 +439,7 @@ void Guild::BankTab::SetInfo(std::string const& name, std::string const& icon)
CharacterDatabase.Execute(stmt);
}
-void Guild::BankTab::SetText(std::string const& text)
+void Guild::BankTab::SetText(std::string_view text)
{
if (m_text == text)
return;
@@ -530,9 +524,7 @@ Guild::Member::Member(ObjectGuid::LowType guildId, ObjectGuid guid, GuildRankId
m_weekActivity(0),
m_totalReputation(0),
m_weekReputation(0)
-{
- memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS) * sizeof(uint32));
-}
+{}
void Guild::Member::SetStats(Player* player)
{
@@ -545,7 +537,7 @@ void Guild::Member::SetStats(Player* player)
m_achievementPoints = player->GetAchievementPoints();
}
-void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation)
+void Guild::Member::SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation)
{
m_name = name;
m_level = level;
@@ -556,7 +548,7 @@ void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class,
m_totalReputation = reputation;
}
-void Guild::Member::SetPublicNote(std::string const& publicNote)
+void Guild::Member::SetPublicNote(std::string_view publicNote)
{
if (m_publicNote == publicNote)
return;
@@ -564,12 +556,12 @@ void Guild::Member::SetPublicNote(std::string const& publicNote)
m_publicNote = publicNote;
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_PNOTE);
- stmt->setString(0, publicNote);
+ stmt->setString(0, m_publicNote);
stmt->setUInt64(1, m_guid.GetCounter());
CharacterDatabase.Execute(stmt);
}
-void Guild::Member::SetOfficerNote(std::string const& officerNote)
+void Guild::Member::SetOfficerNote(std::string_view officerNote)
{
if (m_officerNote == officerNote)
return;
@@ -577,7 +569,7 @@ void Guild::Member::SetOfficerNote(std::string const& officerNote)
m_officerNote = officerNote;
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_OFFNOTE);
- stmt->setString(0, officerNote);
+ stmt->setString(0, m_officerNote);
stmt->setUInt64(1, m_guid.GetCounter());
CharacterDatabase.Execute(stmt);
}
@@ -911,7 +903,7 @@ bool Guild::BankMoveItemData::HasWithdrawRights(MoveItemData* pOther) const
int32 slots = 0;
if (Member const* member = m_pGuild->GetMember(m_pPlayer->GetGUID()))
- slots = m_pGuild->_GetMemberRemainingSlots(member, m_container);
+ slots = m_pGuild->_GetMemberRemainingSlots(*member, m_container);
return slots != 0;
}
@@ -1114,39 +1106,18 @@ Guild::Guild():
m_createdDate(0),
m_accountsNumber(0),
m_bankMoney(0),
- m_eventLog(nullptr),
- m_newsLog(nullptr),
m_achievementMgr(this)
{
- memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*));
}
Guild::~Guild()
{
CharacterDatabaseTransaction temp(nullptr);
_DeleteBankItems(temp);
-
- // Cleanup
- delete m_eventLog;
- m_eventLog = nullptr;
- delete m_newsLog;
- m_newsLog = nullptr;
-
- for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
- {
- delete m_bankEventLog[tabId];
- m_bankEventLog[tabId] = nullptr;
- }
-
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- {
- delete itr->second;
- itr->second = nullptr;
- }
}
// Creates new guild with default data and saves it to database.
-bool Guild::Create(Player* pLeader, std::string const& name)
+bool Guild::Create(Player* pLeader, std::string_view name)
{
// Check if guild with such name already exists
if (sGuildMgr->GetGuildByName(name))
@@ -1163,10 +1134,9 @@ bool Guild::Create(Player* pLeader, std::string const& name)
m_motd = "No message set.";
m_bankMoney = 0;
m_createdDate = GameTime::GetGameTime();
- _CreateLogHolders();
TC_LOG_DEBUG("guild", "GUILD: creating guild [%s] for leader %s %s",
- name.c_str(), pLeader->GetName().c_str(), m_leaderGuid.ToString().c_str());
+ m_name.c_str(), pLeader->GetName().c_str(), m_leaderGuid.ToString().c_str());
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
@@ -1177,7 +1147,7 @@ bool Guild::Create(Player* pLeader, std::string const& name)
uint8 index = 0;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD);
stmt->setUInt64( index, m_id);
- stmt->setString(++index, name);
+ stmt->setString(++index, m_name);
stmt->setUInt64(++index, m_leaderGuid.GetCounter());
stmt->setString(++index, m_info);
stmt->setString(++index, m_motd);
@@ -1201,7 +1171,7 @@ bool Guild::Create(Player* pLeader, std::string const& name)
if (leader)
SendEventNewLeader(leader, nullptr);
- sScriptMgr->OnGuildCreate(this, pLeader, name);
+ sScriptMgr->OnGuildCreate(this, pLeader, m_name);
}
return ret;
@@ -1221,7 +1191,7 @@ void Guild::Disband()
while (!m_members.empty())
{
auto itr = m_members.begin();
- DeleteMember(trans, itr->second->GetGUID(), true);
+ DeleteMember(trans, itr->second.GetGUID(), true);
}
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD);
@@ -1302,7 +1272,7 @@ void Guild::OnPlayerStatusChange(Player* player, uint32 flag, bool state)
}
}
-bool Guild::SetName(std::string const& name)
+bool Guild::SetName(std::string_view name)
{
if (m_name == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
return false;
@@ -1331,35 +1301,34 @@ void Guild::HandleRoster(WorldSession* session)
roster.MemberData.reserve(m_members.size());
- for (auto itr : m_members)
+ bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
+ for (auto const& [guid, member] : m_members)
{
- Member* member = itr.second;
+ WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
- WorldPackets::Guild::GuildRosterMemberData memberData;
-
- memberData.Guid = member->GetGUID();
- memberData.RankID = int32(member->GetRankId());
- memberData.AreaID = int32(member->GetZoneId());
- memberData.PersonalAchievementPoints = int32(member->GetAchievementPoints());
- memberData.GuildReputation = int32(member->GetTotalReputation());
- memberData.LastSave = member->GetInactiveDays();
+ memberData.Guid = member.GetGUID();
+ memberData.RankID = int32(member.GetRankId());
+ memberData.AreaID = int32(member.GetZoneId());
+ memberData.PersonalAchievementPoints = int32(member.GetAchievementPoints());
+ memberData.GuildReputation = int32(member.GetTotalReputation());
+ memberData.LastSave = member.GetInactiveDays();
//GuildRosterProfessionData
memberData.VirtualRealmAddress = GetVirtualRealmAddress();
- memberData.Status = member->GetFlags();
- memberData.Level = member->GetLevel();
- memberData.ClassID = member->GetClass();
- memberData.Gender = member->GetGender();
+ memberData.Status = member.GetFlags();
+ memberData.Level = member.GetLevel();
+ memberData.ClassID = member.GetClass();
+ memberData.Gender = member.GetGender();
memberData.Authenticated = false;
memberData.SorEligible = false;
- memberData.Name = member->GetName();
- memberData.Note = member->GetPublicNote();
- memberData.OfficerNote = member->GetOfficerNote();
+ memberData.Name = member.GetName();
+ memberData.Note = member.GetPublicNote();
+ if (sendOfficerNote)
+ memberData.OfficerNote = member.GetOfficerNote();
- roster.MemberData.push_back(memberData);
}
roster.WelcomeText = m_motd;
@@ -1460,7 +1429,7 @@ void Guild::HandleGetAchievementMembers(WorldSession* session, uint32 achievemen
m_achievementMgr.SendAchievementMembers(session->GetPlayer(), achievementId);
}
-void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
+void Guild::HandleSetMOTD(WorldSession* session, std::string_view motd)
{
if (m_motd == motd)
return;
@@ -1472,10 +1441,10 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
{
m_motd = motd;
- sScriptMgr->OnGuildMOTDChanged(this, motd);
+ sScriptMgr->OnGuildMOTDChanged(this, m_motd);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MOTD);
- stmt->setString(0, motd);
+ stmt->setString(0, m_motd);
stmt->setUInt64(1, m_id);
CharacterDatabase.Execute(stmt);
@@ -1483,7 +1452,7 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
}
}
-void Guild::HandleSetInfo(WorldSession* session, std::string const& info)
+void Guild::HandleSetInfo(WorldSession* session, std::string_view info)
{
if (m_info == info)
return;
@@ -1493,10 +1462,10 @@ void Guild::HandleSetInfo(WorldSession* session, std::string const& info)
{
m_info = info;
- sScriptMgr->OnGuildInfoChanged(this, info);
+ sScriptMgr->OnGuildInfoChanged(this, m_info);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_INFO);
- stmt->setString(0, info);
+ stmt->setString(0, m_info);
stmt->setUInt64(1, m_id);
CharacterDatabase.Execute(stmt);
}
@@ -1522,7 +1491,7 @@ void Guild::HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo)
}
}
-void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& name, bool isSelfPromote)
+void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string_view name, bool isSelfPromote)
{
Player* player = session->GetPlayer();
@@ -1561,7 +1530,7 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- _SetLeader(trans, newGuildMaster);
+ _SetLeader(trans, *newGuildMaster);
oldGuildMaster->ChangeRank(trans, _GetLowestRankId());
SendEventNewLeader(newGuildMaster, oldGuildMaster, isSelfPromote);
@@ -1569,7 +1538,7 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na
CharacterDatabase.CommitTransaction(trans);
}
-void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon)
+void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon)
{
BankTab* tab = GetBankTab(tabId);
if (!tab)
@@ -1588,7 +1557,7 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string
BroadcastPacket(packet.Write());
}
-void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note, ObjectGuid guid, bool isPublic)
+void Guild::HandleSetMemberNote(WorldSession* session, std::string_view note, ObjectGuid guid, bool isPublic)
{
// Player must have rights to set public/officer note
if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EDIT_PUBLIC_NOTE : GR_RIGHT_EOFFNOTE))
@@ -1608,15 +1577,13 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note,
}
}
-void Guild::HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots)
+void Guild::HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> const& rightsAndSlots)
{
// Only leader can modify ranks
if (!_IsLeader(session->GetPlayer()))
SendCommandResult(session, GUILD_COMMAND_CHANGE_RANK, ERR_GUILD_PERMISSIONS);
else if (RankInfo* rankInfo = GetRankInfo(rankId))
{
- TC_LOG_DEBUG("guild", "Changed RankName to '%s', rights to 0x%08X", name.c_str(), rights);
-
rankInfo->SetName(name);
rankInfo->SetRights(rights);
_SetRankBankMoneyPerDay(rankId, moneyPerDay * GOLD);
@@ -1668,7 +1635,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId)
SendPermissions(session); /// Hack to force client to update permissions
}
-void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
+void Guild::HandleInviteMember(WorldSession* session, std::string_view name)
{
Player* pInvitee = ObjectAccessor::FindPlayerByName(name);
if (!pInvitee)
@@ -1711,7 +1678,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_GUILD_COMMAND_SUCCESS, name);
- TC_LOG_DEBUG("guild", "Player %s invited %s to join his Guild", player->GetName().c_str(), name.c_str());
+ TC_LOG_DEBUG("guild", "Player %s invited %s to join his Guild", player->GetName().c_str(), pInvitee->GetName().c_str());
pInvitee->SetGuildIdInvited(m_id);
_LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID().GetCounter(), pInvitee->GetGUID().GetCounter());
@@ -1925,7 +1892,7 @@ void Guild::HandleSetMemberRank(WorldSession* session, ObjectGuid targetGuid, Ob
SendGuildRanksUpdate(setterGuid, targetGuid, newRank->GetId());
}
-void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
+void Guild::HandleAddNewRank(WorldSession* session, std::string_view name)
{
uint8 size = _GetRanksSize();
if (size >= GUILD_RANKS_MAX_COUNT)
@@ -2091,7 +2058,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool
if (!_HasRankRight(player, repair ? GR_RIGHT_WITHDRAW_REPAIR : GR_RIGHT_WITHDRAW_GOLD))
return false;
- if (_GetMemberRemainingMoney(member) < int64(amount)) // Check if we have enough slot/money today
+ if (_GetMemberRemainingMoney(*member) < int64(amount)) // Check if we have enough slot/money today
return false;
// Call script after validation and before money transfer.
@@ -2185,19 +2152,13 @@ void Guild::HandleGuildRequestChallengeUpdate(WorldSession* session) const
void Guild::SendEventLog(WorldSession* session) const
{
- GuildLog* logs = m_eventLog->GetGuildLog();
-
- if (!logs)
- return;
+ std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
WorldPackets::Guild::GuildEventLogQueryResults packet;
- packet.Entry.reserve(m_eventLog->GetSize());
+ packet.Entry.reserve(eventLog.size());
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- EventLogEntry* eventLog = static_cast<EventLogEntry*>(*itr);
- eventLog->WritePacket(packet);
- }
+ for (EventLogEntry const& entry : eventLog)
+ entry.WritePacket(packet);
session->SendPacket(packet.Write());
@@ -2206,19 +2167,13 @@ void Guild::SendEventLog(WorldSession* session) const
void Guild::SendNewsUpdate(WorldSession* session) const
{
- GuildLog* logs = m_newsLog->GetGuildLog();
-
- if (!logs)
- return;
+ std::list<NewsLogEntry> const& newsLog = m_newsLog.GetGuildLog();
WorldPackets::Guild::GuildNews packet;
- packet.NewsEvents.reserve(m_newsLog->GetSize());
+ packet.NewsEvents.reserve(newsLog.size());
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- NewsLogEntry* eventLog = static_cast<NewsLogEntry*>(*itr);
- eventLog->WritePacket(packet);
- }
+ for (NewsLogEntry const& newsLogEntry : newsLog)
+ newsLogEntry.WritePacket(packet);
session->SendPacket(packet.Write());
@@ -2230,10 +2185,7 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
// GUILD_BANK_MAX_TABS send by client for money log
if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
{
- GuildLog* logs = m_bankEventLog[tabId]->GetGuildLog();
-
- if (!logs)
- return;
+ std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
WorldPackets::Guild::GuildBankLogQueryResults packet;
packet.Tab = int32(tabId);
@@ -2241,12 +2193,9 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
//if (tabId == GUILD_BANK_MAX_TABS && hasCashFlow)
// packet.WeeklyBonusMoney.Set(uint64(weeklyBonusMoney));
- packet.Entry.reserve(m_bankEventLog[tabId]->GetSize());
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- BankEventLogEntry* bankEventLog = static_cast<BankEventLogEntry*>(*itr);
- bankEventLog->WritePacket(packet);
- }
+ packet.Entry.reserve(bankEventLog.size());
+ for (BankEventLogEntry const& entry : bankEventLog)
+ entry.WritePacket(packet);
session->SendPacket(packet.Write());
@@ -2277,10 +2226,9 @@ void Guild::SendPermissions(WorldSession* session) const
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
{
- WorldPackets::Guild::GuildPermissionsQueryResults::GuildRankTabPermissions tabPerm;
+ WorldPackets::Guild::GuildPermissionsQueryResults::GuildRankTabPermissions& tabPerm = queryResult.Tab.emplace_back();
tabPerm.Flags = _GetRankBankTabRights(rankId, tabId);
- tabPerm.WithdrawItemLimit = _GetMemberRemainingSlots(member, tabId);
- queryResult.Tab.push_back(tabPerm);
+ tabPerm.WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
}
session->SendPacket(queryResult.Write());
@@ -2293,7 +2241,7 @@ void Guild::SendMoneyInfo(WorldSession* session) const
if (!member)
return;
- int64 amount = _GetMemberRemainingMoney(member);
+ int64 amount = _GetMemberRemainingMoney(*member);
WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet;
packet.RemainingWithdrawMoney = amount;
@@ -2468,11 +2416,10 @@ bool Guild::LoadFromDB(Field* fields)
if (purchasedTabs > GUILD_BANK_MAX_TABS)
purchasedTabs = GUILD_BANK_MAX_TABS;
- m_bankTabs.resize(purchasedTabs);
+ m_bankTabs.clear();
+ m_bankTabs.reserve(purchasedTabs);
for (uint8 i = 0; i < purchasedTabs; ++i)
- m_bankTabs[i] = new BankTab(m_id, i);
-
- _CreateLogHolders();
+ m_bankTabs.emplace_back(m_id, i);
return true;
}
@@ -2489,17 +2436,24 @@ bool Guild::LoadMemberFromDB(Field* fields)
{
ObjectGuid::LowType lowguid = fields[1].GetUInt64();
ObjectGuid playerGuid(ObjectGuid::Create<HighGuid::Player>(lowguid));
- Member* member = new Member(m_id, playerGuid, GuildRankId(fields[2].GetUInt8()));
- if (!member->LoadFromDB(fields))
+
+ auto [memberIt, isNew] = m_members.try_emplace(playerGuid, m_id, playerGuid, GuildRankId(fields[2].GetUInt8()));
+ if (!isNew)
+ {
+ TC_LOG_ERROR("guild", "Tried to add %s to guild '%s'. Member already exists.", playerGuid.ToString().c_str(), m_name.c_str());
+ return false;
+ }
+
+ Member& member = memberIt->second;
+ if (!member.LoadFromDB(fields))
{
CharacterDatabaseTransaction trans(nullptr);
Guild::_DeleteMemberFromDB(trans, lowguid);
- delete member;
+ m_members.erase(memberIt);
return false;
}
sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
- m_members[member->GetGUID()] = member;
return true;
}
@@ -2511,18 +2465,18 @@ void Guild::LoadBankRightFromDB(Field* fields)
_SetRankBankTabRightsAndSlots(GuildRankId(fields[2].GetUInt8()), rightsAndSlots, false);
}
-bool Guild::LoadEventLogFromDB(Field* fields) const
+bool Guild::LoadEventLogFromDB(Field* fields)
{
- if (m_eventLog->CanInsert())
+ if (m_eventLog.CanInsert())
{
- m_eventLog->LoadEvent(new EventLogEntry(
+ m_eventLog.LoadEvent(
m_id, // guild id
fields[1].GetUInt32(), // guid
fields[6].GetInt64(), // timestamp
GuildEventLogTypes(fields[2].GetUInt8()), // event type
fields[3].GetUInt64(), // player guid 1
fields[4].GetUInt64(), // player guid 2
- fields[5].GetUInt8())); // rank
+ fields[5].GetUInt8()); // rank
return true;
}
return false;
@@ -2535,8 +2489,8 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
{
uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
- LogHolder* pLog = m_bankEventLog[tabId];
- if (pLog->CanInsert())
+ LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
+ if (bankLog.CanInsert())
{
uint32 guid = fields[2].GetUInt32();
GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].GetUInt8());
@@ -2553,7 +2507,7 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
TC_LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: %u, Guild: " UI64FMTD ") belongs to money tab, ignoring...", guid, m_id);
return false;
}
- pLog->LoadEvent(new BankEventLogEntry(
+ bankLog.LoadEvent(
m_id, // guild id
guid, // guid
fields[8].GetInt64(), // timestamp
@@ -2562,25 +2516,25 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
fields[4].GetUInt64(), // player guid
fields[5].GetUInt64(), // item or money
fields[6].GetUInt16(), // itam stack count
- fields[7].GetUInt8())); // dest tab id
+ fields[7].GetUInt8()); // dest tab id
}
}
return true;
}
-void Guild::LoadGuildNewsLogFromDB(Field* fields) const
+void Guild::LoadGuildNewsLogFromDB(Field* fields)
{
- if (!m_newsLog->CanInsert())
+ if (!m_newsLog.CanInsert())
return;
- m_newsLog->LoadEvent(new NewsLogEntry(
+ m_newsLog.LoadEvent(
m_id, // guild id
fields[1].GetUInt32(), // guid
fields[6].GetInt64(), // timestamp //64 bits?
GuildNews(fields[2].GetUInt8()), // type
ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()), // player guid
fields[4].GetUInt32(), // Flags
- fields[5].GetUInt32())); // value
+ fields[5].GetUInt32()); // value
}
void Guild::LoadBankTabFromDB(Field* fields)
@@ -2589,7 +2543,7 @@ void Guild::LoadBankTabFromDB(Field* fields)
if (tabId >= _GetPurchasedTabsSize())
TC_LOG_ERROR("guild", "Invalid tab (tabId: %u) in guild bank, skipped.", tabId);
else
- m_bankTabs[tabId]->LoadFromDB(fields);
+ m_bankTabs[tabId].LoadFromDB(fields);
}
bool Guild::LoadBankItemFromDB(Field* fields)
@@ -2601,7 +2555,7 @@ bool Guild::LoadBankItemFromDB(Field* fields)
fields[0].GetUInt32(), fields[1].GetUInt32());
return false;
}
- return m_bankTabs[tabId]->LoadItemFromDB(fields);
+ return m_bankTabs[tabId].LoadItemFromDB(fields);
}
// Validates guild data loaded from database. Returns false if guild should be deleted.
@@ -2643,9 +2597,9 @@ bool Guild::Validate()
}
// Validate members' data
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (!GetRankInfo(itr->second->GetRankId()))
- itr->second->ChangeRank(trans, _GetLowestRankId());
+ for (auto& [guid, member] : m_members)
+ if (!GetRankInfo(member.GetRankId()))
+ member.ChangeRank(trans, _GetLowestRankId());
// Repair the structure of the guild.
// If the guildmaster doesn't exist or isn't member of the guild
@@ -2663,13 +2617,13 @@ bool Guild::Validate()
}
}
else if (!leader->IsRank(GuildRankId::GuildMaster))
- _SetLeader(trans, leader);
+ _SetLeader(trans, *leader);
// Check config if multiple guildmasters are allowed
if (!sConfigMgr->GetBoolDefault("Guild.AllowMultipleGuildMaster", false))
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->GetRankId() == GuildRankId::GuildMaster && !itr->second->IsSamePlayer(m_leaderGuid))
- itr->second->ChangeRank(trans, GetRankInfo(GuildRankOrder(1))->GetId());
+ for (auto& [guid, member] : m_members)
+ if (member.GetRankId() == GuildRankId::GuildMaster && !member.IsSamePlayer(m_leaderGuid))
+ member.ChangeRank(trans, GetRankInfo(GuildRankOrder(1))->GetId());
if (trans->GetSize() > 0)
CharacterDatabase.CommitTransaction(trans);
@@ -2678,30 +2632,30 @@ bool Guild::Validate()
}
// Broadcasts
-void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language) const
+void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language) const
{
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
{
WorldPackets::Chat::Chat packet;
packet.Initialize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
WorldPacket const* data = packet.Write();
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindConnectedPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (Player* player = member.FindConnectedPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID(), session->GetAccountGUID()))
player->SendDirectMessage(data);
}
}
-void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix, bool isLogged) const
+void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string_view msg, std::string_view prefix, bool isLogged) const
{
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
{
WorldPackets::Chat::Chat packet;
packet.Initialize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, session->GetPlayer(), nullptr, msg, 0, "", DEFAULT_LOCALE, prefix);
WorldPacket const* data = packet.Write();
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (Player* player = member.FindPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID(), session->GetAccountGUID()) &&
player->GetSession()->IsAddonRegistered(prefix))
@@ -2711,24 +2665,24 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::
void Guild::BroadcastPacketToRank(WorldPacket const* packet, GuildRankId rankId) const
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->IsRank(rankId))
- if (Player* player = itr->second->FindConnectedPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (member.IsRank(rankId))
+ if (Player* player = member.FindConnectedPlayer())
player->SendDirectMessage(packet);
}
void Guild::BroadcastPacket(WorldPacket const* packet) const
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (Player* player = member.FindConnectedPlayer())
player->SendDirectMessage(packet);
}
void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const
{
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->IsTrackingCriteriaId(criteriaId))
- if (Player* player = itr->second->FindPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (member.IsTrackingCriteriaId(criteriaId))
+ if (Player* player = member.FindPlayer())
player->GetSession()->SendPacket(packet);
}
@@ -2736,7 +2690,7 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max
{
WorldPackets::Calendar::CalendarCommunityInvite packet;
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
+ for (auto const& [guid, member] : m_members)
{
// not sure if needed, maybe client checks it as well
if (packet.Invites.size() >= CALENDAR_MAX_INVITES)
@@ -2746,19 +2700,18 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max
return;
}
- Member* member = itr->second;
- if (member->GetGUID() == session->GetPlayer()->GetGUID())
+ if (guid == session->GetPlayer()->GetGUID())
continue;
- uint32 level = sCharacterCache->GetCharacterLevelByGuid(member->GetGUID());
+ uint32 level = sCharacterCache->GetCharacterLevelByGuid(guid);
if (level < minLevel || level > maxLevel)
continue;
- RankInfo const* rank = GetRankInfo(member->GetRankId());
+ RankInfo const* rank = GetRankInfo(member.GetRankId());
if (rank->GetOrder() > minRank)
continue;
- packet.Invites.emplace_back(member->GetGUID(), level);
+ packet.Invites.emplace_back(guid, level);
}
session->SendPacket(packet.Write());
@@ -2787,21 +2740,28 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti
if (!rankId)
rankId = _GetLowestRankId();
- Member* member = new Member(m_id, guid, *rankId);
+ auto [memberIt, isNew] = m_members.try_emplace(guid, m_id, guid, *rankId);
+ if (!isNew)
+ {
+ TC_LOG_ERROR("guild", "Tried to add %s to guild '%s'. Member already exists.", guid.ToString().c_str(), m_name.c_str());
+ return false;
+ }
+
+ Member& member = memberIt->second;
std::string name;
if (player)
{
- m_members[guid] = member;
player->SetInGuild(m_id);
player->SetGuildIdInvited(UI64LIT(0));
player->SetGuildRank(AsUnderlyingType(*rankId));
player->SetGuildLevel(GetLevel());
+ member.SetStats(player);
SendLoginInfo(player->GetSession());
name = player->GetName();
}
else
{
- member->ResetFlags();
+ member.ResetFlags();
bool ok = false;
// Player must exist
@@ -2811,7 +2771,7 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti
{
Field* fields = result->Fetch();
name = fields[0].GetString();
- member->SetStats(
+ member.SetStats(
name,
fields[1].GetUInt8(),
fields[2].GetUInt8(),
@@ -2820,19 +2780,18 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti
fields[5].GetUInt32(),
0);
- ok = member->CheckStats();
+ ok = member.CheckStats();
}
if (!ok)
{
- delete member;
+ m_members.erase(memberIt);
return false;
}
- m_members[guid] = member;
sCharacterCache->UpdateCharacterGuildId(guid, GetId());
}
- member->SaveToDB(trans);
+ member.SaveToDB(trans);
_UpdateAccountsNumber();
_LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid);
@@ -2857,12 +2816,12 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
{
Member* oldLeader = nullptr;
Member* newLeader = nullptr;
- for (auto i = m_members.begin(); i != m_members.end(); ++i)
+ for (auto& [memberGuid, member] : m_members)
{
- if (i->first == guid)
- oldLeader = i->second;
- else if (!newLeader || newLeader->GetRankId() > i->second->GetRankId())
- newLeader = i->second;
+ if (memberGuid == guid)
+ oldLeader = &member;
+ else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
+ newLeader = &member;
}
if (!newLeader)
@@ -2873,7 +2832,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
return;
}
- _SetLeader(trans, newLeader);
+ _SetLeader(trans, *newLeader);
// If leader does not exist (at guild loading with deleted leader) do not send broadcasts
if (oldLeader)
@@ -2885,12 +2844,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
// Call script on remove before member is actually removed from guild (and database)
sScriptMgr->OnGuildRemoveMember(this, guid, isDisbanding, isKicked);
- auto memberItr = m_members.find(guid);
- if (memberItr != m_members.end())
- {
- delete memberItr->second;
- m_members.erase(memberItr);
- }
+ m_members.erase(guid);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
Player* player = ObjectAccessor::FindConnectedPlayer(guid);
@@ -2927,8 +2881,7 @@ bool Guild::ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid
bool Guild::IsMember(ObjectGuid guid) const
{
- Members::const_iterator itr = m_members.find(guid);
- return itr != m_members.end();
+ return m_members.find(guid) != m_members.end();
}
// Bank (items move)
@@ -2960,7 +2913,7 @@ void Guild::SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uin
}
// Bank tabs
-void Guild::SetBankTabText(uint8 tabId, std::string const& text)
+void Guild::SetBankTabText(uint8 tabId, std::string_view text)
{
if (BankTab* pTab = GetBankTab(tabId))
{
@@ -3029,18 +2982,10 @@ void Guild::_DeleteMemberFromDB(CharacterDatabaseTransaction& trans, ObjectGuid:
}
// Private methods
-void Guild::_CreateLogHolders()
-{
- m_eventLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
- m_newsLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT));
- for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
- m_bankEventLog[tabId] = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
-}
-
void Guild::_CreateNewBankTab()
{
uint8 tabId = _GetPurchasedTabsSize(); // Next free id
- m_bankTabs.push_back(new BankTab(m_id, tabId));
+ m_bankTabs.emplace_back(m_id, tabId);
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
@@ -3080,7 +3025,7 @@ void Guild::_CreateDefaultGuildRanks(CharacterDatabaseTransaction& trans, Locale
_CreateRank(trans, sObjectMgr->GetTrinityString(LANG_GUILD_INITIATE, loc), GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
}
-bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string const& name, uint32 rights)
+bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string_view name, uint32 rights)
{
if (m_ranks.size() >= GUILD_RANKS_MAX_COUNT)
return false;
@@ -3116,9 +3061,9 @@ bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string const&
void Guild::_UpdateAccountsNumber()
{
// We use a set to be sure each element will be unique
- std::set<uint32> accountsIdSet;
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- accountsIdSet.insert(itr->second->GetAccountId());
+ std::unordered_set<uint32> accountsIdSet;
+ for (auto const& [guid, member] : m_members)
+ accountsIdSet.insert(member.GetAccountId());
m_accountsNumber = accountsIdSet.size();
}
@@ -3138,11 +3083,8 @@ bool Guild::_IsLeader(Player* player) const
void Guild::_DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeItemsFromDB)
{
for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
- {
- m_bankTabs[tabId]->Delete(trans, removeItemsFromDB);
- delete m_bankTabs[tabId];
- m_bankTabs[tabId] = nullptr;
- }
+ m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
+
m_bankTabs.clear();
}
@@ -3165,17 +3107,14 @@ bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount,
return true;
}
-void Guild::_SetLeader(CharacterDatabaseTransaction& trans, Member* leader)
+void Guild::_SetLeader(CharacterDatabaseTransaction trans, Member& leader)
{
- if (!leader)
- return;
-
bool isInTransaction = bool(trans);
if (!isInTransaction)
trans = CharacterDatabase.BeginTransaction();
- m_leaderGuid = leader->GetGUID();
- leader->ChangeRank(trans, GuildRankId::GuildMaster);
+ m_leaderGuid = leader.GetGUID();
+ leader.ChangeRank(trans, GuildRankId::GuildMaster);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_LEADER);
stmt->setUInt64(0, m_leaderGuid.GetCounter());
@@ -3237,37 +3176,33 @@ inline int8 Guild::_GetRankBankTabRights(GuildRankId rankId, uint8 tabId) const
return 0;
}
-inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId) const
+inline int32 Guild::_GetMemberRemainingSlots(Member const& member, uint8 tabId) const
{
- if (member)
+ GuildRankId rankId = member.GetRankId();
+ if (rankId == GuildRankId::GuildMaster)
+ return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
+ if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
{
- GuildRankId rankId = member->GetRankId();
- if (rankId == GuildRankId::GuildMaster)
- return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
- if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
- {
- int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankTabWithdrawValue(tabId);
- if (remaining > 0)
- return remaining;
- }
+
+ int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankTabWithdrawValue(tabId);
+ if (remaining > 0)
+ return remaining;
+
}
return 0;
}
-inline int64 Guild::_GetMemberRemainingMoney(Member const* member) const
+inline int64 Guild::_GetMemberRemainingMoney(Member const& member) const
{
- if (member)
- {
- GuildRankId rankId = member->GetRankId();
- if (rankId == GuildRankId::GuildMaster)
- return std::numeric_limits<int64>::max();
+ GuildRankId rankId = member.GetRankId();
+ if (rankId == GuildRankId::GuildMaster)
+ return std::numeric_limits<int64>::max();
- if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
- {
- int64 remaining = (int64(_GetRankBankMoneyPerDay(rankId)) * GOLD) - member->GetBankMoneyWithdrawValue();
- if (remaining > 0)
- return remaining;
- }
+ if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
+ {
+ int64 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankMoneyWithdrawValue();
+ if (remaining > 0)
+ return remaining;
}
return 0;
}
@@ -3294,7 +3229,7 @@ inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 right
inline void Guild::_LogEvent(GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
{
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- m_eventLog->AddEvent(trans, new EventLogEntry(m_id, m_eventLog->GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank));
+ m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
CharacterDatabase.CommitTransaction(trans);
sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1, playerGuid2, newRank);
@@ -3316,8 +3251,8 @@ void Guild::_LogBankEvent(CharacterDatabaseTransaction& trans, GuildBankEventLog
tabId = GUILD_BANK_MAX_TABS;
dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
}
- LogHolder* pLog = m_bankEventLog[tabId];
- pLog->AddEvent(trans, new BankEventLogEntry(m_id, pLog->GetNextGUID(), eventType, dbTabId, lowguid, itemOrMoney, itemStackCount, destTabId));
+ LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
+ pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, lowguid, itemOrMoney, itemStackCount, destTabId);
sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, lowguid, itemOrMoney, itemStackCount, destTabId);
}
@@ -3515,13 +3450,18 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const
packet.ItemInfo.push_back(itemInfo);
}
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
- if (Player* player = itr->second->FindPlayer())
- {
- packet.WithdrawalsRemaining = _GetMemberRemainingSlots(itr->second, tabId);
- player->GetSession()->SendPacket(packet.Write());
- }
+ for (auto const& [guid, member] : m_members)
+ {
+ if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
+ continue;
+
+ Player* player = member.FindPlayer();
+ if (!player)
+ continue;
+
+ packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId);
+ player->GetSession()->SendPacket(packet.Write());
+ }
}
}
@@ -3534,7 +3474,7 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co
WorldPackets::Guild::GuildBankQueryResults packet;
packet.Money = m_bankMoney;
- packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId);
+ packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
packet.Tab = int32(tabId);
packet.FullUpdate = fullUpdate;
@@ -3544,11 +3484,10 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co
packet.TabInfo.reserve(_GetPurchasedTabsSize());
for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
{
- WorldPackets::Guild::GuildBankTabInfo tabInfo;
+ WorldPackets::Guild::GuildBankTabInfo& tabInfo = packet.TabInfo.emplace_back();
tabInfo.TabIndex = i;
- tabInfo.Name = m_bankTabs[i]->GetName();
- tabInfo.Icon = m_bankTabs[i]->GetIcon();
- packet.TabInfo.push_back(tabInfo);
+ tabInfo.Name = m_bankTabs[i].GetName();
+ tabInfo.Icon = m_bankTabs[i].GetIcon();
}
}
@@ -3570,7 +3509,8 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co
{
if (Item* tabItem = tab->GetItem(slotId))
{
- WorldPackets::Guild::GuildBankItemInfo itemInfo;
+ WorldPackets::Guild::GuildBankItemInfo& itemInfo = packet.ItemInfo.emplace_back();
+
itemInfo.Slot = int32(slotId);
itemInfo.Item.ItemID = tabItem->GetEntry();
@@ -3594,8 +3534,6 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co
}
itemInfo.Locked = false;
-
- packet.ItemInfo.push_back(itemInfo);
}
}
}
@@ -3625,10 +3563,10 @@ void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, G
void Guild::ResetTimes(bool weekly)
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
+ for (auto& [guid, member] : m_members)
{
- itr->second->ResetValues(weekly);
- if (Player* player = itr->second->FindPlayer())
+ member.ResetValues(weekly);
+ if (Player* player = member.FindPlayer())
{
WorldPackets::Guild::GuildMemberDailyReset packet; // tells the client to request bank withdrawal limit
player->GetSession()->SendPacket(packet.Write());
@@ -3636,17 +3574,15 @@ void Guild::ResetTimes(bool weekly)
}
}
-void Guild::AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value) const
+void Guild::AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value)
{
- NewsLogEntry* news = new NewsLogEntry(m_id, m_newsLog->GetNextGUID(), GuildNews(type), guid, flags, value);
-
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- m_newsLog->AddEvent(trans, news);
+ NewsLogEntry& news = m_newsLog.AddEvent(trans, m_id, m_newsLog.GetNextGUID(), GuildNews(type), guid, flags, value);
CharacterDatabase.CommitTransaction(trans);
WorldPackets::Guild::GuildNews newsPacket;
newsPacket.NewsEvents.reserve(1);
- news->WritePacket(newsPacket);
+ news.WritePacket(newsPacket);
BroadcastPacket(newsPacket.Write());
}
@@ -3660,28 +3596,27 @@ void Guild::UpdateCriteria(CriteriaType type, uint64 miscValue1, uint64 miscValu
m_achievementMgr.UpdateCriteria(type, miscValue1, miscValue2, miscValue3, ref, player);
}
-void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) const
+void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky)
{
- GuildLog* logs = m_newsLog->GetGuildLog();
- GuildLog::iterator itr = logs->begin();
- while (itr != logs->end() && (*itr)->GetGUID() != newsId)
+ std::list<NewsLogEntry>& newsLog = m_newsLog.GetGuildLog();
+ auto itr = newsLog.begin();
+ while (itr != newsLog.end() && itr->GetGUID() != newsId)
++itr;
- if (itr == logs->end())
+ if (itr == newsLog.end())
{
TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] requested unknown newsId %u - Sticky: %u",
session->GetPlayerInfo().c_str(), newsId, sticky);
return;
}
- NewsLogEntry* news = static_cast<NewsLogEntry*>(*itr);
- news->SetSticky(sticky);
+ itr->SetSticky(sticky);
TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] changed newsId %u sticky to %u",
session->GetPlayerInfo().c_str(), newsId, sticky);
WorldPackets::Guild::GuildNews newsPacket;
newsPacket.NewsEvents.reserve(1);
- news->WritePacket(newsPacket);
+ itr->WritePacket(newsPacket);
session->SendPacket(newsPacket.Write());
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 8167d04b31e..075acebb06e 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -24,7 +24,9 @@
#include "Optional.h"
#include "RaceMask.h"
#include "SharedDefines.h"
+#include <set>
#include <unordered_map>
+#include <unordered_set>
class Item;
class Player;
@@ -296,9 +298,7 @@ class GuildBankRightsAndSlots
int32 slots;
};
-typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec;
-
-typedef std::set <uint8> SlotIds;
+using SlotIds = std::set<uint8>;
class TC_GAME_API Guild
{
@@ -310,11 +310,11 @@ class TC_GAME_API Guild
Member(ObjectGuid::LowType guildId, ObjectGuid guid, GuildRankId rankId);
void SetStats(Player* player);
- void SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation);
+ void SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation);
bool CheckStats() const;
- void SetPublicNote(std::string const& publicNote);
- void SetOfficerNote(std::string const& officerNote);
+ void SetPublicNote(std::string_view publicNote);
+ void SetOfficerNote(std::string_view officerNote);
void SetZoneId(uint32 id) { m_zoneId = id; }
void SetAchievementPoints(uint32 val) { m_achievementPoints = val; }
void SetLevel(uint8 var) { m_level = var; }
@@ -385,7 +385,7 @@ class TC_GAME_API Guild
std::set<uint32> m_trackedCriteriaIds;
- uint32 m_bankWithdraw[GUILD_BANK_MAX_TABS];
+ std::array<uint32, GUILD_BANK_MAX_TABS> m_bankWithdraw;
uint64 m_bankWithdrawMoney;
uint32 m_achievementPoints;
uint64 m_totalActivity;
@@ -510,27 +510,30 @@ class TC_GAME_API Guild
};
// Class encapsulating work with events collection
- typedef std::list<LogEntry*> GuildLog;
-
+ template <typename Entry>
class LogHolder
{
public:
- LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { }
- ~LogHolder();
+ LogHolder();
+
+ // Checks if new log entry can be added to holder
+ bool CanInsert() const { return m_log.size() < m_maxRecords; }
- uint8 GetSize() const { return uint8(m_log.size()); }
- // Checks if new log entry can be added to holder when loading from DB
- inline bool CanInsert() const { return m_log.size() < m_maxRecords; }
// Adds event from DB to collection
- void LoadEvent(LogEntry* entry);
+ template <typename... Ts>
+ void LoadEvent(Ts&&... args);
+
// Adds new event to collection and saves it to DB
- void AddEvent(CharacterDatabaseTransaction& trans, LogEntry* entry);
+ template <typename... Ts>
+ Entry& AddEvent(CharacterDatabaseTransaction trans, Ts&&... args);
+
uint32 GetNextGUID();
- GuildLog* GetGuildLog() { return &m_log; }
+ std::list<Entry>& GetGuildLog() { return m_log; }
+ std::list<Entry> const& GetGuildLog() const { return m_log; }
private:
- GuildLog m_log;
- uint32 m_maxRecords;
+ std::list<Entry> m_log;
+ uint32 const m_maxRecords;
uint32 m_nextGUID;
};
@@ -540,7 +543,7 @@ class TC_GAME_API Guild
public:
RankInfo(): m_guildId(UI64LIT(0)), m_rankId(GuildRankId(0xFF)), m_rankOrder(GuildRankOrder(0)), m_rights(GR_RIGHT_NONE), m_bankMoneyPerDay(0) { }
RankInfo(ObjectGuid::LowType guildId) : m_guildId(guildId), m_rankId(GuildRankId(0xFF)), m_rankOrder(GuildRankOrder(0)), m_rights(GR_RIGHT_NONE), m_bankMoneyPerDay(0) { }
- RankInfo(ObjectGuid::LowType guildId, GuildRankId rankId, GuildRankOrder rankOrder, std::string const& name, uint32 rights, uint32 money) :
+ RankInfo(ObjectGuid::LowType guildId, GuildRankId rankId, GuildRankOrder rankOrder, std::string_view name, uint32 rights, uint32 money) :
m_guildId(guildId), m_rankId(rankId), m_rankOrder(rankOrder), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { }
void LoadFromDB(Field* fields);
@@ -552,7 +555,7 @@ class TC_GAME_API Guild
void SetOrder(GuildRankOrder rankOrder) { m_rankOrder = rankOrder; }
std::string const& GetName() const { return m_name; }
- void SetName(std::string const& name);
+ void SetName(std::string_view name);
uint32 GetRights() const { return m_rights; }
void SetRights(uint32 rights);
@@ -584,7 +587,7 @@ class TC_GAME_API Guild
std::string m_name;
uint32 m_rights;
uint32 m_bankMoneyPerDay;
- GuildBankRightsAndSlots m_bankTabRightsAndSlots[GUILD_BANK_MAX_TABS];
+ std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> m_bankTabRightsAndSlots = {};
};
class BankTab
@@ -596,8 +599,8 @@ class TC_GAME_API Guild
bool LoadItemFromDB(Field* fields);
void Delete(CharacterDatabaseTransaction& trans, bool removeItemsFromDB = false);
- void SetInfo(std::string const& name, std::string const& icon);
- void SetText(std::string const& text);
+ void SetInfo(std::string_view name, std::string_view icon);
+ void SetText(std::string_view text);
void SendText(Guild const* guild, WorldSession* session) const;
std::string const& GetName() const { return m_name; }
@@ -611,7 +614,7 @@ class TC_GAME_API Guild
ObjectGuid::LowType m_guildId;
uint8 m_tabId;
- Item* m_items[GUILD_BANK_MAX_SLOTS];
+ std::array<Item*, GUILD_BANK_MAX_SLOTS> m_items = {};
std::string m_name;
std::string m_icon;
std::string m_text;
@@ -706,18 +709,14 @@ class TC_GAME_API Guild
void CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count);
};
- typedef std::unordered_map<ObjectGuid, Member*> Members;
- typedef std::vector<RankInfo> Ranks;
- typedef std::vector<BankTab*> BankTabs;
-
public:
- static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param = "");
+ static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param = "");
static void SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode);
Guild();
~Guild();
- bool Create(Player* pLeader, std::string const& name);
+ bool Create(Player* pLeader, std::string_view name);
void Disband();
void SaveToDB();
@@ -732,28 +731,28 @@ class TC_GAME_API Guild
time_t GetCreatedDate() const { return m_createdDate; }
uint64 GetBankMoney() const { return m_bankMoney; }
- bool SetName(std::string const& name);
+ bool SetName(std::string_view name);
// Handle client commands
void HandleRoster(WorldSession* session);
void SendQueryResponse(WorldSession* session, ObjectGuid const& playerGuid);
void HandleSetAchievementTracking(WorldSession* session, uint32 const* achievementIdsBegin, uint32 const* achievementIdsEnd);
void HandleGetAchievementMembers(WorldSession* session, uint32 achievementId) const;
- void HandleSetMOTD(WorldSession* session, std::string const& motd);
- void HandleSetInfo(WorldSession* session, std::string const& info);
+ void HandleSetMOTD(WorldSession* session, std::string_view motd);
+ void HandleSetInfo(WorldSession* session, std::string_view info);
void HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo);
- void HandleSetNewGuildMaster(WorldSession* session, std::string const& name, bool isSelfPromote);
- void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon);
- void HandleSetMemberNote(WorldSession* session, std::string const& note, ObjectGuid guid, bool isPublic);
- void HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots);
+ void HandleSetNewGuildMaster(WorldSession* session, std::string_view name, bool isSelfPromote);
+ void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon);
+ void HandleSetMemberNote(WorldSession* session, std::string_view note, ObjectGuid guid, bool isPublic);
+ void HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> const& rightsAndSlots);
void HandleBuyBankTab(WorldSession* session, uint8 tabId);
- void HandleInviteMember(WorldSession* session, std::string const& name);
+ void HandleInviteMember(WorldSession* session, std::string_view name);
void HandleAcceptMember(WorldSession* session);
void HandleLeaveMember(WorldSession* session);
void HandleRemoveMember(WorldSession* session, ObjectGuid guid);
void HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool demote);
void HandleSetMemberRank(WorldSession* session, ObjectGuid guid, ObjectGuid setterGuid, GuildRankOrder rank);
- void HandleAddNewRank(WorldSession* session, std::string const& name);
+ void HandleAddNewRank(WorldSession* session, std::string_view name);
void HandleRemoveRank(WorldSession* session, GuildRankOrder rankOrder);
void HandleShiftRank(WorldSession* session, GuildRankOrder rankOrder, bool shiftUp);
void HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow = false);
@@ -761,7 +760,7 @@ class TC_GAME_API Guild
void HandleMemberLogout(WorldSession* session);
void HandleDelete(WorldSession* session);
void HandleGuildPartyRequest(WorldSession* session) const;
- void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) const;
+ void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky);
void HandleGuildRequestChallengeUpdate(WorldSession* session) const;
void UpdateMemberData(Player* player, uint8 dataid, uint32 value);
@@ -788,10 +787,10 @@ class TC_GAME_API Guild
// Load from DB
bool LoadFromDB(Field* fields);
- void LoadGuildNewsLogFromDB(Field* fields) const;
+ void LoadGuildNewsLogFromDB(Field* fields);
void LoadRankFromDB(Field* fields);
bool LoadMemberFromDB(Field* fields);
- bool LoadEventLogFromDB(Field* fields) const;
+ bool LoadEventLogFromDB(Field* fields);
void LoadBankRightFromDB(Field* fields);
void LoadBankTabFromDB(Field* fields);
bool LoadBankEventLogFromDB(Field* fields);
@@ -799,8 +798,8 @@ class TC_GAME_API Guild
bool Validate();
// Broadcasts
- void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const;
- void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix, bool isLogged) const;
+ void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language = LANG_UNIVERSAL) const;
+ void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string_view msg, std::string_view prefix, bool isLogged) const;
void BroadcastPacketToRank(WorldPacket const* packet, GuildRankId rankId) const;
void BroadcastPacket(WorldPacket const* packet) const;
void BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const;
@@ -811,7 +810,7 @@ class TC_GAME_API Guild
void BroadcastWorker(Do& _do, Player* except = nullptr)
{
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindConnectedPlayer())
+ if (Player* player = itr->second.FindConnectedPlayer())
if (player != except)
_do(player);
}
@@ -829,7 +828,7 @@ class TC_GAME_API Guild
void SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount);
// Bank tabs
- void SetBankTabText(uint8 tabId, std::string const& text);
+ void SetBankTabText(uint8 tabId, std::string_view text);
GuildAchievementMgr& GetAchievementMgr() { return m_achievementMgr; }
GuildAchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; }
@@ -837,7 +836,7 @@ class TC_GAME_API Guild
// Pre-6.x guild leveling
uint8 GetLevel() const { return GUILD_OLD_MAX_LEVEL; }
- void AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value) const;
+ void AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value);
EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; }
void ResetTimes(bool weekly);
@@ -857,14 +856,14 @@ class TC_GAME_API Guild
uint32 m_accountsNumber;
uint64 m_bankMoney;
- Ranks m_ranks;
- Members m_members;
- BankTabs m_bankTabs;
+ std::vector<RankInfo> m_ranks;
+ std::unordered_map<ObjectGuid, Member> m_members;
+ std::vector<BankTab> m_bankTabs;
// These are actually ordered lists. The first element is the oldest entry.
- LogHolder* m_eventLog;
- LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1];
- LogHolder* m_newsLog;
+ LogHolder<EventLogEntry> m_eventLog;
+ std::array<LogHolder<BankEventLogEntry>, GUILD_BANK_MAX_TABS + 1> m_bankEventLog = {};
+ LogHolder<NewsLogEntry> m_newsLog;
GuildAchievementMgr m_achievementMgr;
private:
@@ -878,46 +877,44 @@ class TC_GAME_API Guild
inline GuildRankId _GetLowestRankId() const { return m_ranks.back().GetId(); }
inline uint8 _GetPurchasedTabsSize() const { return uint8(m_bankTabs.size()); }
- inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : nullptr; }
- inline BankTab const* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : nullptr; }
+ inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; }
+ inline BankTab const* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; }
inline Member const* GetMember(ObjectGuid const& guid) const
{
auto itr = m_members.find(guid);
- return itr != m_members.end() ? itr->second : nullptr;
+ return (itr != m_members.end()) ? &itr->second : nullptr;
}
inline Member* GetMember(ObjectGuid const& guid)
{
auto itr = m_members.find(guid);
- return itr != m_members.end() ? itr->second : nullptr;
+ return (itr != m_members.end()) ? &itr->second : nullptr;
}
- inline Member* GetMember(std::string const& name)
+ inline Member* GetMember(std::string_view name)
{
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->GetName() == name)
- return itr->second;
+ if (itr->second.GetName() == name)
+ return &itr->second;
return nullptr;
}
static void _DeleteMemberFromDB(CharacterDatabaseTransaction& trans, ObjectGuid::LowType lowguid);
- // Creates log holders (either when loading or when creating guild)
- void _CreateLogHolders();
// Tries to create new bank tab
void _CreateNewBankTab();
// Creates default guild ranks with names in given locale
void _CreateDefaultGuildRanks(CharacterDatabaseTransaction& trans, LocaleConstant loc);
// Creates new rank
- bool _CreateRank(CharacterDatabaseTransaction& trans, std::string const& name, uint32 rights);
+ bool _CreateRank(CharacterDatabaseTransaction& trans, std::string_view name, uint32 rights);
// Update account number when member added/removed from guild
void _UpdateAccountsNumber();
bool _IsLeader(Player* player) const;
void _DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeItemsFromDB = false);
bool _ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add);
- void _SetLeader(CharacterDatabaseTransaction& trans, Member* leader);
+ void _SetLeader(CharacterDatabaseTransaction trans, Member& leader);
void _SetRankBankMoneyPerDay(GuildRankId rankId, uint32 moneyPerDay);
void _SetRankBankTabRightsAndSlots(GuildRankId rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true);
@@ -927,8 +924,8 @@ class TC_GAME_API Guild
int32 _GetRankBankTabSlotsPerDay(GuildRankId rankId, uint8 tabId) const;
std::string _GetRankName(GuildRankId rankId) const;
- int32 _GetMemberRemainingSlots(Member const* member, uint8 tabId) const;
- int64 _GetMemberRemainingMoney(Member const* member) const;
+ int32 _GetMemberRemainingSlots(Member const& member, uint8 tabId) const;
+ int64 _GetMemberRemainingMoney(Member const& member) const;
void _UpdateMemberWithdrawSlots(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 tabId);
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 rights) const;
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index a497d20b652..aa113f369e4 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -21,6 +21,7 @@
#include "Guild.h"
#include "Log.h"
#include "ObjectMgr.h"
+#include "Util.h"
#include "World.h"
#include <algorithm>
@@ -81,17 +82,12 @@ Guild* GuildMgr::GetGuildByGuid(ObjectGuid guid) const
return nullptr;
}
-Guild* GuildMgr::GetGuildByName(const std::string& guildName) const
+Guild* GuildMgr::GetGuildByName(std::string_view guildName) const
{
- std::string search = guildName;
- std::transform(search.begin(), search.end(), search.begin(), ::toupper);
- for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr)
- {
- std::string gname = itr->second->GetName();
- std::transform(gname.begin(), gname.end(), gname.begin(), ::toupper);
- if (search == gname)
- return itr->second;
- }
+ for (auto [id, guild] : GuildStore)
+ if (StringEqualI(guild->GetName(), guildName))
+ return guild;
+
return nullptr;
}
diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h
index bcd11d226ac..f700f8122c1 100644
--- a/src/server/game/Guilds/GuildMgr.h
+++ b/src/server/game/Guilds/GuildMgr.h
@@ -40,7 +40,7 @@ public:
Guild* GetGuildByLeader(ObjectGuid guid) const;
Guild* GetGuildById(ObjectGuid::LowType guildId) const;
Guild* GetGuildByGuid(ObjectGuid guid) const;
- Guild* GetGuildByName(std::string const& guildName) const;
+ Guild* GetGuildByName(std::string_view guildName) const;
std::string GetGuildNameById(ObjectGuid::LowType guildId) const;
void LoadGuildRewards();
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index 8c82e3ae0e7..3596e1fefdd 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -514,7 +514,7 @@ void WorldSession::HandleGuildSetRankPermissions(WorldPackets::Guild::GuildSetRa
if (!guild)
return;
- GuildBankRightsAndSlotsVec rightsAndSlots(GUILD_BANK_MAX_TABS);
+ std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> rightsAndSlots;
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, uint8(packet.TabFlags[tabId]), uint32(packet.TabWithdrawItemLimit[tabId]));
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index 3be2bf786a9..a4ecc96c08c 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -22,6 +22,7 @@
#include "Duration.h"
#include "Tuples.h"
#include <boost/container/static_vector.hpp>
+#include <string_view>
#include <ctime>
namespace WorldPackets
@@ -79,6 +80,7 @@ namespace WorldPackets
bool empty() const { return _storage.empty(); }
char const* c_str() const { return _storage.c_str(); }
+ operator std::string_view() const { return _storage; }
operator std::string&() { return _storage; }
operator std::string const&() const { return _storage; }
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 8e58a700c6c..0e14b0afc49 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -931,7 +931,7 @@ void WorldSession::SaveTutorialsData(CharacterDatabaseTransaction& trans)
_tutorialsChanged &= ~TUTORIALS_FLAG_CHANGED;
}
-bool WorldSession::IsAddonRegistered(const std::string& prefix) const
+bool WorldSession::IsAddonRegistered(std::string_view prefix) const
{
if (!_filterAddonMessages) // if we have hit the softcap (64) nothing should be filtered
return true;
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 89f0038d6fc..b71a6a193d3 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -962,7 +962,7 @@ class TC_GAME_API WorldSession
bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; }
bool PlayerDisconnected() const;
- bool IsAddonRegistered(const std::string& prefix) const;
+ bool IsAddonRegistered(std::string_view prefix) const;
void SendPacket(WorldPacket const* packet, bool forced = false);
void AddInstanceConnection(std::shared_ptr<WorldSocket> sock) { m_Socket[CONNECTION_TYPE_INSTANCE] = sock; }